自前のブログ作り③ ー 環境準備: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公式リポジトリのパッケージを使って再度インストールした。

非エンジニアの素人が調べた時に振り回されたのが、まず前述の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のパケットフィルタも利用しているので、ufwの方は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」のディレクトリを使うらしいので、こちらに倣ってみる。

/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のサーバーブロックにドメインを設定

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をインストールします。