HTTP/3対応のnginxのインストール
Webサイト高速化のためHTTP/3に対応できるnginxをインストールしていく。
なお、HTTP/3には以下のようなメリットがあるらしい。
- 高速な通信: HTTP/3はUDPを使用しており、TCPのような接続確立のための複雑な手続きを省略できます。これにより、通信の遅延が減少し、Webページの読み込み速度が向上します。
- 効率的なデータ転送: HTTP/3はQUICプロトコルを基盤としており、パケットロスが発生しても他のデータの転送を続けることができます。これにより、全体的なデータ転送の効率が向上します。
- セキュリティの向上: HTTP/3は暗号化通信を前提としており、TLS 1.3を使用しています。これにより、セキュリティが強化され、データの安全性が高まります。
- 信頼性の向上: QUICプロトコルにより、接続の再確立が迅速に行われるため、モバイル環境などでの接続の安定性が向上します。
nginxバージョンの確認
nginxでHTTP/3に対応するためにはバージョン1.25以上が必要となる。
apt でインストールされるnginxのバージョンを以下のコマンドで確認する。
sudo apt update sudo apt info nginx
user@ubuntu:~$ sudo apt info nginx Package: nginx Version: 1.24.0-2ubuntu7 Priority: optional ...
バージョンが1.25未満の場合は、以下aptリポジトリの更新を行ってからnginxをインストールする。
aptリポジトリの更新
バージョンが1.25よりも古い場合は、以下手順のコマンドで最新nginxの安定版をaptのリポジトリに追加する。(詳細はnginx公式参照)
- 前提条件ツールのインストール
- 公式のnginx署名鍵をインポートし、apt がパッケージを検証できるようにする
- 安定版nginxパッケージをaptリポジトリに設定する
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
上記を実行したらaptでインストールされるnginxのバージョンを再度確認する。
sudo apt update sudo apt info nginx
user@ubuntu:~$ sudo apt info nginx Package: nginx Version: 1.26.1-2~noble Priority: optional ...
バージョンが1.25以上であればOK。
nginxのインストール
sudo apt install nginx
インストール後 nginx -v
でバージョンが1.25以上であることを確認する。
user@ubuntu:~$ nginx -v nginx version: nginx/1.26.1
certbotのインストール
HTTP/3には必須ということと、今どきSSL対応しないはありえないのでLet'sEncryptのSSL証明書を発行する
certbotによりSSL証明書を自動更新できるようにする。
インストール
sudo apt install certbot sudo apt install python3-certbot-nginx
インストールが完了したら証明書を発行する
ここで指定するドメインでアクセスできる必要があるので事前にドメインの設定を確認しておく
サブドメインを追加する場合は過去分もまとめて再実行する
sudo certbot certonly --nginx -d xxxxx.net -d sub1.xxxxx.net -d sub2.xxxxx.net
発行に成功すると /etc/letsencrypt/live/
にSSL証明書が発行される
Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for xxxxx.net and 2 more domains Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/xxxxx.net/fullchain.pem Key is saved at: /etc/letsencrypt/live/xxxxx.net/privkey.pem This certificate expires on 2024-10-25. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.
<その他のコマンド>
■削除(※コマンド実行後対象を選ぶ) sudo certbot delete ■更新 sudo certbot renew ■更新のテスト sudo certbot renew --dry-run ■タイマーの確認 sudo systemctl status certbot.timer
疎通確認
/etc/nginx/nginx.conf
を以下のように編集する。HTTP/3対応としての要点は以下。
- SSL証明書必須
- ssl_protocolsに
TLSv1.3
が必要 - http2,http3の両方が必要
- Alt-Svcのヘッダが必要(初回アクセス時はhttp2だがこれが目印となり次回以降http3で通信するようになるらしい)
http {
ssl_certificate /etc/letsencrypt/live/xxxxx.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxxxx.net/privkey.pem;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
http3 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
location / {
・・・
}
}
}
なお設定ファイルに問題がないことを以下コマンドで確認できる
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
設定ファイルの以下のどちらかで反映できる
--設定ファイルの反映 sudo nginx -s reload --nginxの再起動 sudo systemctl restart nginx
設定を反映したら通信がHTTP/3になっていることを確認する。要点は以下。
-
ブラウザのF12開発者ツールでネットワークのプロトコルが「h3」になっていることを確認する。
- うまくいかない場合は、ブラウザのキャッシュクリア/再起動後に何度かアクセスしてみる(前回の通信プロトコルをブラウザが記憶するらしい)
- UDP443がポート開放されているか?
- プロキシやVPN経由などそもそもHTTP3(UDP443)が利用できない環境ではないか?
Googleなどhttp3対応のサイトでネットワークのプロトコルが「h3」になっているかを確認するとよい。 - http3checkで確認できる。