ServersMan@VPS+Nginx+Let’s Encryptで作るSSLサイト

ServersMan@VPS といえば、コスパのいいサービスですよね。

メモリ 1GB と HDD 50GB がワンコインで手に入るなんていい時代になったものです。
ただし、CPU はかなり貧弱で WordPress なんかを運用するのには少々荷が重いです。
それでも値段を考えれば十分なのではないでしょうか。

そんな理由から新規で開発をスタートする場合、私は大体 ServersMan@VPS を使っています。

今回は ServersMan@VPS に Nginx と Let’sEncrypt を導入してみたいと思います。
この構成であれば Hugo なんかを使ったサイトを作るのに役立つのではないでしょうか。

それでは早速導入していきましょう。
スタート地点はサーバーを新しく契約したところからです。
既にサーバーを使っている場合には不要になる手順もあるかと思いますので、適度に飛ばしてください。

なお、特別に記述がない場合全ての作業は root ユーザーで行っています。
作業用ユーザーなどで root ユーザーでない場合は開始前に root ユーザーになっておいてください。

su -

Apache の停止と無効化

初期状態では Apache がインストールされており、ご丁寧にも自動起動の設定までされています。
この記事の内容では Apache は未来永劫使用しませんので、停止した後自動起動の設定も無効にしてしまいましょう。

apachectl stop
chkconfig httpd off

これで Apache が勝手に起動することはなくなりました。

yum をアップデート

下記コマンドを打って yum のアップデートを行います。
※initscripts の更新によるログイン不可問題は初期設定で回避されています

yum update -y --skip-broken

かなり時間がかかります。気長に待ちましょう。

Nginx のインストール

2018/1/25 現在、サーバーの初期設定状態では Nginx が yum のリポジトリに存在しません。
まずは Nginx のリポジトリを yum に登録します。

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

これで yum から Nginx をインストールできるようになります。
が、このリポジトリでインストールできるのは stable です。
mainline をインストールしたい場合にはリポジトリの URL を書き換えてあげる必要があります。
(※何のことか分からない人は無視して頂いていいです)


(mainline に書き換える場合のみ)

vi /etc/yum.repos.d/nginx.repo

「baseurl」の値を以下のように書き換えてください。

baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/

これだけです。


それでは Nginx をインストールしましょう。

yum install -y nginx

インストールが完了したら Nginx のバージョンを確認してみましょう。

nginx -v
=> nginx version: nginx/1.12.2 (stable の場合)
=> nginx version: nginx/1.13.8 (mainline の場合)

これで Nginx のインストールは完了です。

Let’sEncrypt のインストール

いろいろなサイトで yum を用いたインストール方法が紹介されていますが、ServersMan@VPS ではinitscripts を更新できない関係で依存性が解決できずインストールできません。
直接 Git から letsencrypt (certbot) のリポジトリを clone してインストールします。

まず Git がなければ始まらないのでインストールします。

yum install -y git

完了したらバージョンを確認しつつインストールできたことを確認しましょう。

git --version
=> git version 1.8.3.1

次に letsencrypt のインストールに必要なパッケージをインストールしていきます。

yum install -y epel-release
yum install -y python-pip
pip install virtualenv

次に letsencrypt のリポジトリを clone します。
実行時のディレクトリに clone されるので、root のホーム (/root) に移動してからにしましょう。

cd ~
git clone git://github.com/letsencrypt/letsencrypt

※2018/04/02 追記 clone できなくなっていますね・・・。原因調べ中です。
※2018/04/03 追記 「https」を「git」にしたらできました。謎。でも調べない。

完了したら clone でできたディレクトリへ移動し、インストールを行います。

cd letsencrypt/
./letsencrypt-auto --help --no-bootstrap

これで必要なミドルウェアが全て揃いました。
実行ファイルは以下に配置されているので、覚えておいてください。

/root/letsencrypt/letsencrypt-auto

証明書の取得

いよいよ証明書を取得していきます。
Let'sEncrypt では2通りの方法で証明書を発行することができます。

  • Let'sEncrypt 自体がフロントエンドサーバーとなり、認証局からのアクセスを処理する方法
  • Nginx や Apache などのフロントエンドサーバーの DocumentRoot に認証用の HTML を配置し、認証局からのアクセスを処理する方法

前者の方が比較的簡単に認証を行うことができますが、フロントエンドサーバーは同居が不可である (80 番ポートが競合してしまう) ため認証の際には Nginx や Apache を停止する必要があります。

つまりはほんの少しの間でもサイトを停止しなければならないという意味で、それはあまりうれしいお話ではないでしょう。

そこで今回は後者の方法、Nginx や Apache を停止せずに証明書だけ更新できる方法を使いたいと思います。

まずは Nginx を起動しましょう。
ついでに Nginx の自動起動も有効にしておきましょう。

nginx
chkconfig nginx on

ブラウザからドメインを打ち込んで、Nginx の初期ページ (Welcome to nginx!) が表示されればちゃんと起動しています。
この時点でページが表示できない場合はドメインのレコード設定を見直してください。

証明書の取得はコマンド一つで行えます。

./letsencrypt-auto certonly --webroot --webroot-path /usr/share/nginx/html -d www.kurage.net -m sample@email.com --agree-tos -n

「-d」で指定するドメインや「-m」で指定するメールアドレスは置き換えてください。

ここまでの手順に間違いがなければ証明書が以下のフォルダに生成されます。

/etc/letsencrypt/live/www.kurage.net/

例によってドメインは置き換えて確認してください。

最後にこの証明書を Nginx に設定すれば全て完了です。
もう少々お付き合いください。

証明書の設定

Nginx の設定ファイルに証明書を読み込む設定を記述していきます。
今回は面倒なので最低限の設定だけのファイルを作成します。

cd /etc/nginx/conf.d/
vi https.conf

以下の内容を書き込みます。

server {
    listen       443;
    ssl          on;
    server_name  www.kurage.net;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    ssl_certificate /etc/letsencrypt/live/www.kurage.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.kurage.net/privkey.pem;
}

例によってドメインは (以下略)

保存したら構文エラーがないかだけチェックしてから設定ファイルのリロードを行います。
こうすることで再起動や設定ファイルのリロード前に気づくことができます。

nginx -t
=> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
   nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx -s reload

それでは先ほどブラウザで確認していた URL を https に変えてみましょう。
ちゃんと Nginx の初期ページ (Welcome to nginx!) が表示されたでしょうか。

表示されていれば成功です。お疲れ様でした。

終わりに

情報が古かったり、実際に試してできなかったりと構築に苦労したので手順書作成がてら記事を書かせてもらいました。
この情報がどなたかの役に立てばうれしいものです。

ここまでお付き合い頂きありがとうございました。