自前のブログ作り③ ー 環境準備:Nginxをインストールして、Let's Encryptで常時SSL化する

schedule Published
published_with_changes Updated
Category folderMake
format_list_bulleted Contents

前回準備したUbuntuサーバーに、Nginx(エンジンエックス)をインストールします。
さくらの記事はCentOS贔屓なので、Ubuntuでのインストール紹介記事などを探して参考にしました。
CentOSプロジェクト終了の影響で、日本でも海外と同じくUbuntuが一番人気になるかもしれません。

Nginxのインストールと稼動確認

パッケージを利用してインストールする方法は、2通りあるようです。

  • Ubuntuリポジトリのパッケージを利用する(OS標準版)

    aptでインストールするだけでよいですが、Nginxの最新版ではありません。

  • Nginx公式リポジトリのパッケージを利用する

    最新版をインストールできますが、リポジトリの登録が必要です。(Debian/Ubuntuでリポジトリを追加する際、そのリポジトリの信頼性を確保するため公開鍵を入手し、aptで公開鍵を登録する必要があります。)

まずUbuntuリポジトリのパッケージでインストールしたのですが、最新安定版(stable)にしたかったのでNginx公式リポジトリのパッケージを使って再度インストールしました。
Nginx公式リポジトリのパッケージについては、nginx: Linux packagesopen_in_newで確認でき、手順も記載されています。

非エンジニアの素人が調べた時に振り回されたのが、まず前述のUbuntuリポジトリの情報とNginx公式リポジトリの情報があること、次にNginx公式リポジトリからインストールする手順の情報が、Install | NGINX (https://www.nginx.com)open_in_newに記載の方法とnginx: Linux packages (https://nginx.org)open_in_newに記載の方法があることでした。
インストール紹介記事を見る時、この知識があれば混乱しないで済むと思います。

Nginx公式リポジトリのパッケージをインストールする

「https://nginx.com」記載の方法でインストールしました。Ubuntuでアプリをインストールするときは、「deb」という形式のインストールパッケージを利用します。まずは、Nginx公式のリポジトリをaptのソースリストに追加します。

/etc/apt/sources.listに追記したのですが、/etc/apt/sources.list.d/nginx.listで別ファイルを作る方法の方が良かったかなと思います。

/etc/apt/sources.listに追記
deb https://nginx.org/packages/ubuntu/ focal nginx #“focal”はUbuntu 20.04のリリース名
deb-src https://nginx.org/packages/ubuntu/ focal nginx

追加したリポジトリを反映します。

追加したリポジトリを反映
$ sudo apt update

下記のようにGPGエラーが返されますが、これが正しい挙動のようですので問題ありません。
追加したリポジトリの公開鍵がないので、信頼性を検証できないと言われます。

GPG error
W: GPG error: https://nginx.org/packages/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62

GPGエラーのNO_PUBKEYに続くABF5BD827BD9BF62で、aptに公開鍵を追加します。

aptに公開鍵を追加
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62

ちなみに、Nginxの公開鍵には有効期限があります。追加した公開鍵は、「apt-key list 」で有効期限も確認できます。ですが、今後apt-keyは削除予定とのことですので、有効期限内には違う環境と手段になっているかもしれません。
Ubuntu Weekly Recipe » 第675回 apt-keyはなぜ廃止予定となったのかopen_in_new

aptに追加した公開鍵を確認
$ sudo apt-key list

少し脱線しましたが、公開鍵を追加したので、もう一度リポジトリを反映してインストールを実行します。

追加したリポジトリを反映して、Nginxをインストール
$ sudo apt update
$ sudo apt install nginx

無事にインストールできました。
Nginx導入時によくやることとして、バージョン情報を非表示にするとあるのでやっておきます。

/etc/nginx/nginx.conf
︙
http {
    server_tokens off; #offにしてバージョン情報を非表示にする

Nginxの稼働確認

まずはインストールしたNginxを起動します。

$ sudo systemctl start nginx

実際にWebページを閲覧して確認したいため、ファイアウォールのhttp通信を許可します。

ufwの設定に追加
$ sudo ufw allow 'Nginx Full' #'Nginx Full'でhttpとhttpsを許可

確認時点ではhttpだけでも良いのですが、さくらのVPSのパケットフィルタも利用しているので、httpとhttpsのどちらも許可しておきます。パケットフィルタを利用している場合は、パケットフィルタも許可しないと見れないので注意です。

「http://<サーバーIP>」にアクセスして、Nginxのデフォルトページを確認できました。

Nginxのサーバーブロックを作成する

今はデフォルトのサーバーブロックしかありませんので、自分のWebコンテンツ用のドキュメントルートとサーバーブロック(設定ファイル)を用意していきます。Ubuntu 20.04にNginxをインストールする方法open_in_newの「ステップ5 – サーバーブロックのセットアップ (推奨)」を参考にしました。

前準備:Webコンテンツのドキュメントルートを作成

設定ファイルに記載するので、Webコンテンツのドキュメントルートを決めておきます。
/var/www/hogehoge/htmlなど任意のディレクトリ構造にテスト用のhtmlファイルを作りました。
新しく作ったディレクトリの所有権やパーミッションも適宜設定しておきます。

サーバーブロックの設定ファイルを作成

Nginxの設定ファイルは/etc/nginxに展開されていますが、UbuntuOS標準の場合とNginx公式とでは少し設定ファイルの構成が違うようです。Ubuntuの場合のお作法では、「sites-available」と「sites-enabled」のディレクトリを使うようなので、こちらに倣いました。nginx.confファイルのhttpブロックに、別ファイルのserverブロックをincludeしているのは同じですので、特にどちらでも良いと思います。

/etc/nginx/sites-available/hogehoge(新しく作成)
server {
        listen 80;
        #listen [::]:80;  IPv6を使っていないので不要
        root /var/www/hogehoge/html; 

        server_name <サーバーIP>; 

        location / {
                try_files $uri $uri/ =404;
        }
}

まずは最低限の確認用の設定となります。実際はhttps対応、StrapiやNuxtのデプロイ時などに設定ファイルを編集していかないといけませんが、素人なので刻んでいきます。一旦保存して閉じましょう。

Ubuntuの「sites-available」と「sites-enabled」を使うお作法ですが、nginx.confには「sites-enabled」内をincludeし、「sites-enabled」に「sites-available」のファイルのシンボリックリンクを貼るようです。

/etc/nginx/nginx.conf
︙
http {
    include /etc/nginx/sites-enabled/*;
︙
シンボリックリンクを貼る
$ sudo ln -s /etc/nginx/sites-available/hogehoge /etc/nginx/sites-enabled/

複数のドメインで運用する場合に、面倒がないようにするためのようです。
使わなくなった場合は、設定ファイルのリンクを外すだけで、ファイル自体は残しておけます。

設定ファイルの構文エラーがないかチェックをして、再起動します。

構文エラーチェック
$ sudo nginx -t
再起動
$ sudo systemctl restart nginx

「http://<サーバーIP>」にアクセスして、自前のテストページを確認できました。

独自ドメインを設定する

ネームサーバーの設定

Let’s Encryptの無料SSLを利用するため、5年近く塩漬けにしていたお名前.comの独自ドメインを、さくらのVPSに設定しておきます。独自ドメインを利用するには、さらくのVPS側のネームサーバー設定・お名前.com側のネームサーバー設定の両方が必要になります。
下記サポート情報ページを参考に進めました。

注意なのが、さくらのVPS側は2週間のお試し期間中にネームサーバーの新規登録ができません。
お試し期間中だったので、後から作業を進めています。

Nginxのサーバーブロックにドメインを設定

前述で作った設定ファイルにドメインを追記します。

/etc/nginx/sites-available/hogehoge
︙
        server_name hogehoge.com www.hogehoge.com;
︙

前述同様、構文エラーチェックとNginxを再起動をした後、独自ドメインでアクセスして自前のテストページを確認できました。

Let's Encrypt発行のSSL証明書をNginxに設定する

Let's Encryptは非営利団体で、無料のSSL証明書を発行してくれます。個人運営のサイトでは無料というのは大変ありがたいですが、有効期間は90日とのこと。30日を切ったら更新する感じらしいです。

Certbotをインストール

Certbotは、Let's Encryptの証明書を簡単なコマンド操作で取得・更新できるソフトウェアだそうです。
aptを使用してCertbotとNginxプラグインをインストールします。

CertbotとNginxプラグインをインストール
$ sudo apt install certbot python3-certbot-nginx

これでNginxプラグインでCertbotを実行すると、Nginxのサーバーブロックのドメインを見つけてくれます。証明書を取得するドメインでアクセスできるようにしていない場合は、Certbotを実行前に設定しておく必要があります。

Certbotを実行

NginxプラグインでCertbotを実行
$ sudo certbot --nginx -d hogehoge.com -d www.hogehoge.com

初めて実行した場合は、メールアドレスの入力、利用規約の同意、メールアドレスの利用、httpとhttpsのリダイレクト設定をどうするか、を求められるので回答していきます。

回答に問題なければ、証明書のダウンロード、インストール、リロードが実行されます。(Nginxの設定ファイルも自動で更新してくれてます。)

Certbotの自動更新設定を確認

証明書の自動更新も設定されているとのことです。設定の確認と更新のテスト実行をしておきます。

証明書の自動更新の設定確認
$ sudo systemctl status certbot.timer
証明書の更新テスト
$ sudo certbot renew --dry-run

返ってくるアウトプットに問題はなさそうなので、実際に期限の30日以内に更新されているか確認してみます。(Let's Encryptの証明書は、残り期限が30日以内になったら更新が可能。)Certbotは至れり尽くせりで驚きました。

「htts://<独自ドメイン>」でアクセスできたら、一旦パケットフィルタでWeb通信を閉じておきます。

おわりに

Nginx関連の作業が、情報を探して理解するのに一番苦労した印象です。
作業中のメモを見ながら記事を書いているのですが、記憶が飛んでいて記事を書くのも一番大変でした。 素人が頑張った内容なので、エンジニアじゃない方の参考になれば幸いです。

サーバーブロックの設定ファイルは、アプリケーション構築後に編集していきます。
WebサーバーときたらDBサーバーです。次はMySQLのインストールになります。