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.0built with OpenSSL 3.0.15+quic 3 Sep 2024TLS SNI support enabledconfigure 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 200server: nginxdate: Thu, 16 Oct 2025 00:34:04 GMTcontent-type: text/html; charset=UTF-8x-powered-by: PHP/8.3.23alt-svc: h3=":443"; ma=86400cache-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.exeApplication curl.exe 8.14.1.0 C:\WINDOWS\system32\curl.exeApplication curl.exe 0.0.0.0 C:\Users\suganuma\scoop\shims\curl.exe
だけどブラウザで表示してもDevToolsのProtocolがh3にならない。
(Edge, Firefoxでも同じ)
DevToolsの「Disable cache」がオンで「キャッシュの消去とハード再読み込み(リロードアイコンを長押し)」でもh2のまま。
追記予定。
▼ 関連記事
- 開発環境で自前HTTPS(SSL)を構築: FreeBSD14 + step-certificates + step-cli
- FreeBSDのNginxをportsでビルド → 本番環境はダウンタイムなしで切り替える
- KUSANAGIでHTTP/3 QUICを試す