HTTP/3をサポートしたNginx(1.25.0)を使ってみた

この記事にはアフィリエイト広告が含まれています

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、なかなか難しいものです。

今後、何か進展があればまた記事にしたいと思います。


広告


この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次