Nginx对特定域名灰度启用HTTP/3需为该域名单独配置server块:listen 443 quic reuseport与listen 443 ssl共存,仅在此块中添加add_header Alt-Svc 'h3=":443"; ma=86400'及ssl_protocols TLSv1.3,并使用专属证书,非灰度域名server块不配置quic和Alt-Svc头。

要在 Nginx 中对特定域名灰度启用 HTTP/3(即只让部分域名走 QUIC+HTTP/3,其余仍走 HTTP/1.1 或 HTTP/2),不能全局开启,也不能靠开关式配置——必须结合域名粒度控制、UDP 端口监听隔离与客户端协商机制来实现。
为灰度域名单独配置 QUIC 监听块
HTTP/3 依赖 QUIC 协议,而 QUIC 使用 UDP 端口(通常 443)。Nginx 要启用 HTTP/3,必须在 对应域名的 server 块中显式声明 UDP 监听,且仅对该域名生效:
- 给灰度域名(如
gray.example.com)配置独立的server块,listen 443 quic reuseport - 同时保留 TCP 的
listen 443 ssl,确保 HTTP/1.1 和 HTTP/2 兼容不中断 - 非灰度域名(如
www.example.com)的 server 块里不写quic指令,就不会启用 HTTP/3
强制启用 HTTP/3 并告知客户端支持
仅监听 UDP 不够,还需通过响应头明确通告 HTTP/3 可用性,且该头只出现在灰度域名响应中:
- 在灰度域名的 server 块内添加:
add_header Alt-Svc 'h3=":443"; ma=86400'; -
ma=86400表示客户端可缓存该能力声明 24 小时,便于灰度观察期控制 - 注意:这个头对非灰度域名不设置,客户端就不会尝试 HTTP/3 升级
TLS 版本与证书必须严格匹配
QUIC(HTTP/3 底层)强制要求 TLS 1.3,且证书需覆盖该域名。若灰度域名使用通配符或独立证书,需确保:
-
ssl_protocols TLSv1.3;必须显式写入灰度域名的 server 块 -
ssl_certificate和ssl_certificate_key指向该域名专属证书路径 - 避免复用主站证书但未覆盖灰度子域名,否则 TLS 握手失败,QUIC 直接退化为 TCP 回退
验证与灰度观测要点
启用后需主动验证是否真正走 HTTP/3,而非“看起来支持”:
- 用 Chrome 访问灰度域名 → F12 → Network → 刷新 → 查看协议列是否显示
h3 - 抓包确认 UDP 443 上有 QUIC 流量(如 Wireshark 过滤
udp.port == 443 and quic) - 监控 Nginx 日志中的
$http_upgrade和$sent_http_alt_svc字段,确认灰度域名确实返回了 Alt-Svc 头 - 逐步放开灰度比例(如先限 IP 段或 User-Agent)再扩量,避免旧客户端兼容问题影响主流程


















