Nginxのバージョン1.25.0でHTTP/3がサポートされました。
(2023年6月4日時点ではMainlineで展開中)
changelogにもある通り、まだ実験的なサポートの段階なのでもしかしたらいろいろ不備な点はあるかもしれませんが試しに使ってみました。
結論から先に述べると私が試した環境においては……
- QUICはサポート済み
- HTTP/3はサポート済み
- アクセスログを確認するとHTTP/3でのアクセスにはなっていない
上記のような状況でした。
個人的には本番環境でHTTP/3を使うのはまだ控えた方がいいかなという印象を受けました。
環境情報
サーバー
- CentOS Stream 9
- ポート開放済み(80/tcp , 443/tcp , 443/udp)
- Nginxは公式リポジトリからdnfコマンドでインストール
- OpenSSH_8.7p1
- OpenSSL 3.0.7
クライアント
- macOS 12.6.6(Monterey)
- Safari(16.5)
- Google Chrome(113.0.5672.126)
Nginxのインストール
/etc/yum.repos.dディレクトリ内に下記の内容で「nginx.repo」を作成しました。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
その後、下記のコマンドにてインストールしました。
sudo dnf install nginx
Nginxの設定ファイルの修正
インストール後、/etc/nginxディレクトリにある「nginx.conf」を下記のように修正しました。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
log_format quic '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http3"';
access_log /var/log/nginx/access_quic.log quic;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
また、/etc/nginx/conf.dディレクトリにある「default.conf」を「default.conf.bak」にリネームして読み込まれないようにして、新たに「http3_test.conf」を下記の内容で作成しました。
(本番運用中のサイトのものをもってきて修正したので一部不要な設定が含まれているかも……)
server {
listen 80;
listen [::]:80;
server_name {ドメイン名};
root /var/www/html/;
index index.html index.php index.xml;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
server_name {ドメイン名};
root /var/www/html/;
index index.html index.php index.xml;
client_max_body_size 1024M;
client_body_buffer_size 512M;
#ssl
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_certificate /etc/letsencrypt/live/{ドメイン名}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem;
location / {
# used to advertise the availability of HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
}
}
チェックサイトの確認結果
HTTP/3接続のチェックサイトにて確認したところ下記のようになりました。
しかし、ブラウザの開発者ツール等を開いた状態で当該ドメインにアクセスしたところ、プロトコルは「h2」と表示されました。
またアクセスログも「HTTP/2.0」で記録されていました。
まとめ
何が原因でHTTP/3でのアクセスになっていないのか、現時点では分かりません。
これ以外にも何かしらの設定が必要?
テスト用のコンテンツがただテキストを表示するだけの単純なHTML(サイズは16byte)だからHTTP/3に切り替わっていない?
HTTP/3とQUIC、なかなか難しいものです。
今後、何か進展があればまた記事にしたいと思います。
コメント