ビルド

nginx-build \
          -d work \
          -c nginx-build-config \
          ...
          -libressl \
          ...
          -v 1.25.0

-c config

./configure \
  ...
  --with-http_v3_module \
  ...

-libressl

何故 openssl を使わないか、詳しくはこちらで

https://zenn.dev/catatsuy/articles/71609eff5611e4

-v 1.25.0

mainline 1.25.0 から実験的にサポート開始

ngx_http_v3_module の詳細はこちら

https://nginx.org/en/docs/http/ngx_http_v3_module.html

nginx config

大事そうなところだけ

# nginx.conf
ssl_protocols TLSv1.3; # HTTP/3 は TLS 1.3 only

# server
# ↓ は default_server 用の server ブロック、reuseport は別 server ブロックでは利用できないのでここで指定することで reuseport を有効化する
server {
  listen      443 ssl http2;
  listen      443 quic reuseport default_server;
  ...
}

# server
# API etc...
server {
  listen      443 quic; # HTTP/3
  listen      443 ssl http2; # HTTP/3 以外も使えるように
  ...

  location / {
    ...
    add_header Alt-Svc 'h3=":443"; ma=2592000'; # このヘッダーでクライアントに HTTP/3 に対応していることを通知する
    ...
  }
}

確認

ヘアピンNAT が有効じゃない環境で試す。
なんでか知らんけどワイの手元マシン(ヘアピンNAT 環境)だと HTTP/2 でで繋いじゃう。

amd64 環境を持っているならこういうコンテナイメージを使って HTTP/3 に対応した curl で動作確認ができる。DYOR

https://hub.docker.com/r/ymuski/curl-http3

不幸にもワイは arm64 なので、VPN 環境の Chrome で確認