nginx启用http/3需四层打通:系统层(内核≥5.4、放行udp 443)、编译层(含--with-http_v3_module和--with-stream_quic_module)、协议层(listen 443 quic reuseport + ssl_protocols tlsv1.3)、响应层(add_header alt-svc 'h3=":443"; ma=86400')。

要让 Nginx 真正跑起 HTTP/3 并在弱网下发挥 0-RTT 和连接迁移优势,不能只改几行配置——得从系统层、编译层、协议层和响应层四面打通。核心目标不是“支持 HTTP/3”,而是让客户端(尤其是移动端)稳定、快速、自动地用上 QUIC。
确认底层能力是否就绪
很多问题卡在第一步:Nginx 声称支持,其实没真正启用 QUIC 模块。
- 运行
nginx -V 2>&1 | grep -E "(http_v3|stream_quic)",必须看到--with-http_v3_module和--with-stream_quic_module,缺一不可 - 内核版本需 ≥ 5.4(推荐 5.7+),执行
uname -r验证;低版本 reuseport 行为异常,UDP 丢包率高 - 检查防火墙是否放行 UDP 443:
ufw status | grep 443/udp或iptables -L INPUT -n | grep :443,没规则就加ufw allow 443/udp - SSL 库建议用 BoringSSL 或 quictls;OpenSSL 3.2+ 可用但 0-RTT 数据重传等高级特性受限
监听与协议强制双到位
QUIC 是 UDP 协议,不靠开关指令,靠 listen 行里的 quic 关键字触发,且必须和 TCP 监听共存以保兼容。
- server 块中至少写两行监听:
listen 443 ssl http2;(TCP,服务旧客户端)listen 443 quic reuseport;(UDP,启用 QUIC;reuseport 必须加,否则多 worker 下连接易中断) - 禁用 TLS 1.2 及以下:
ssl_protocols TLSv1.3;—— QUIC 不协商降级,写了 TLSv1.2 也无效,反而干扰判断 - 不要写
http3 on;,Nginx 不识别该指令;HTTP/3 启用完全由quic监听决定
Alt-Svc 头是浏览器发现 HTTP/3 的唯一入口
没有这个响应头,Chrome、Edge、Firefox 根本不会发起 QUIC 连接,配置再全也白搭。
- 必须加在 server 或 location 块里:
add_header Alt-Svc 'h3=":443"; ma=86400'; - 注意端口一致性:如果监听的是
:443,Alt-Svc 就不能写成h3=":8443",否则被浏览器直接忽略 - 路径需覆盖主站资源:若站点有子路径(如
/api/),确保该 header 在对应 location 中也生效,否则接口请求仍走 HTTP/2
弱网专项调优建议
QUIC 在弱网的价值不止于快,更在于稳。几个关键点可进一步释放潜力:
- 开启 UDP GSO(Generic Segmentation Offload):
quic_gso on;(需内核 ≥ 5.6),减少小包发送开销,提升高丢包场景吞吐 - 调整 QUIC 连接超时:
quic_max_idle_timeout 30000;(单位毫秒),避免弱网下误判断连 - 配合前端使用
preconnect:<link rel="preconnect" href="https://example.com" crossorigin>,让浏览器提前探测 Alt-Svc 并建立 QUIC 连接 - 验证是否真走 HTTP/3:Chrome 开发者工具 → Network → 刷新页面 → 查看某请求的 Protocol 列是否显示
h3;或用curl -I --http3 https://yourdomain.com(需 curl 8.0+)











