FreeBSD14 + Nginx + HTTP/3 QUIC

開発環境でNginxをビルドしてHTTP/3 QUICを試したときの覚書。
Gemini 2.5 Proと対話。

環境: FreeBSD 14.3-RELEASE-p4


1. Nginxをビルド

現在のバージョンとビルドオプションを確認。
見やすく改行付きのコマンド。
# nginx -V 2>&1 | sed 's/ --/\n--/g'

nginx version: nginx/1.28.0
built with OpenSSL 3.0.15+quic 3 Sep 2024
TLS SNI support enabled
configure arguments:
--prefix=/usr/local/etc/nginx
--with-cc-opt='-I /usr/local/include'
--conf-path=/usr/local/etc/nginx/nginx.conf
--sbin-path=/usr/local/sbin/nginx
--pid-path=/var/run/nginx.pid
--error-log-path=/var/log/nginx/error.log
--user=www
--group=www
--with-compat
--with-pcre
--with-file-aio
--http-client-body-temp-path=/var/tmp/nginx/client_body_temp
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
--http-proxy-temp-path=/var/tmp/nginx/proxy_temp
--http-scgi-temp-path=/var/tmp/nginx/scgi_temp
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp
--http-log-path=/var/log/nginx/access.log
--with-http_v2_module
--with-http_v3_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_realip_module
--with-http_slice_module
--with-http_ssl_module
--with-http_stub_status_module
--with-http_sub_module
--without-mail_imap_module
--without-mail_pop3_module
--without-mail_smtp_module
--with-threads
--add-module=/usr/ports/www/nginx/work/ngx_brotli-a71f931
--add-module=/usr/ports/www/nginx/work/ngx_cache_purge-a84b0f3
--add-module=/usr/ports/www/nginx/work/ngx_http_geoip2_module-3.4
--add-module=/usr/ports/www/nginx/work/nginx-module-vts-bf64dbf
--with-ld-opt='-L /usr/local/lib

Postsディレクトリに移動して最新にする。
# cd /usr/ports/
# git pull

Nginxへ移動。
# cd www/nginx/

CFLAGSとLDFLAGSの確認。
# make -V CFLAGS
# make -V LDFLAGS

以前のビルドオプションをすべて削除して再設定。
# make rmconfig-recursive
# make config

オンにしたビルドオプション一覧

  • IPV6
  • THREADS
  • HTTP
  • HTTP_CACHE
  • HTTP_GUNZIP_FILTER
  • HTTP_REALIP
  • HTTP_SLICE
  • HTTP_SSL
  • HTTP_STATUS
  • HTTP_SUB
  • HTTPV2
  • HTTPV3
  • HTTPV3_QTLS

---

  • CACHE_PURGE
  • HTTP_GEOIP2
  • VTS

依存関係も含めてビルドキャッシュをすべてクリーンにしてからビルド実行。
# make clean-depends
# make clean
# make

Nginxはロックしていたのでアンロックしてから再インストール。
# pkg unlock nginx
# make reinstall

インストール後に不要になった作業ディレクトリを削除。
テストして再起動。
# make clean
# nginx -t
# service nginx restart


2. HTTP/3をオンにする設定

Nginxの設定ファイルを編集。
参考: Support for QUIC and HTTP/3
# cd /usr/local/etc/nginx/conf.d/
# less include/listen_443.inc

# 443番ポートをSSL/TLS通信として待ち受けることを明示します。
# この 'ssl' キーワードは削除してはいけません。
listen       443 ssl;
listen       [::]:443 ssl;

# HTTP/2を有効化(Nginx 1.25.4以降)
http2 on;

#
# HTTP/3
#
# HTTP/3 (QUIC) 用にUDPポートをリッスン
# reuseportオプションはパフォーマンス向上のために推奨されます
listen 443 quic reuseport;
listen [::]:443 quic reuseport;

# HTTP/3を有効化
http3 on;

# ブラウザにHTTP/3が利用可能であることを通知するヘッダー
# このヘッダーを受け取ったブラウザは、次回以降QUICで接続を試みます
# "h3"はHTTP/3、"h2"はHTTP/2を意味します。max-ageは秒単位。
add_header Alt-Svc 'h3=":443"; ma=86400';

テストして再起動。
# nginx -t
# service nginx restart

待ち受けポート確認。UDPでListenしているかどうか。
# netstat -an -p udp

WindowsのPowerShellで疎通確認。
kオプションは証明書のチェックをスキップする。
PS> curl -k --http3 -I https://dev.hoge.jp/

HTTP/3 200
server: nginx
date: Thu, 16 Oct 2025 00:34:04 GMT
content-type: text/html; charset=UTF-8
x-powered-by: PHP/8.3.23
alt-svc: h3=":443"; ma=86400
cache-control: no-cache

vオプションを付けると詳細表示する。
PS> curl -k -v --http3 -I https://dev.hoge.jp/

ちなみにScoop版のcurlはHTTP3に対応しているが、Windowsの証明書ストアを参照しない。
Windows標準のcurlはHTTP3に対応していない。
PS> Get-Command curl -All

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> curl.exe
Application     curl.exe                                           8.14.1.0   C:\WINDOWS\system32\curl.exe
Application     curl.exe                                           0.0.0.0    C:\Users\suganuma\scoop\shims\curl.exe


だけどブラウザで表示してもDevToolsのProtocolがh3にならない。
(Edge, Firefoxでも同じ)
DevToolsの「Disable cache」がオンで「キャッシュの消去とハード再読み込み(リロードアイコンを長押し)」でもh2のまま。

追記予定。


▼ 関連記事