Nginx 正确支持 HTTP/2 和 HTTP/3 的核心是满足 ALPN 协商的硬性条件:Nginx ≥ 1.25、OpenSSL ≥ 1.1.1、启用 --with-http_v2_module 和 --with-http_v3_module、配置 listen 443 ssl http2; 与 listen 443 quic reuseport;、ssl_protocols TLSv1.2 TLSv1.3;、ssl_early_data on; 并放行 UDP 443 端口。

要让 Nginx 正确通过 TLS 协商支持 HTTP/2 和 HTTP/3,核心不是“开启 ALPN”这个动作本身(Nginx 1.9.5+ 默认启用),而是确保整个 TLS 握手链路满足 ALPN 所依赖的硬性条件。ALPN 是协商机制,不是开关——它能否成功通告 h2 或 h3,取决于配置是否完整、底层依赖是否就绪、以及网络路径是否透传。
确认基础环境满足协议前提
ALPN 协商失败往往源于底层不兼容,而非配置写错:
- Nginx 版本 ≥ 1.25(HTTP/3 必需;HTTP/2 最低为 1.9.5,但建议统一升级)
- OpenSSL 版本 ≥ 1.1.1(推荐,确保完整 ALPN + TLS 1.3 + QUIC 支持);执行
nginx -V | grep openssl验证 - Nginx 编译时必须含
--with-http_v2_module(HTTP/2)和--with-http_v3_module(HTTP/3,需 1.25+) - 证书必须由支持 ALPN 的 CA 签发(Let’s Encrypt 默认支持,无需额外操作)
HTTPS 监听与 ALPN 协议通告配置
ALPN 协议列表由 Nginx 在 TLS 握手时主动通告,取决于 listen 指令和 ssl_protocols 组合:
- HTTP/2:必须写
listen 443 ssl http2;(IPv4)和listen [::]:443 ssl http2;(IPv6);ssl和http2缺一不可 - HTTP/3:需额外添加
listen 443 quic reuseport;和listen [::]:443 quic reuseport; - 强制启用 TLS 1.2+:
ssl_protocols TLSv1.2 TLSv1.3;(移除 TLSv1.0/1.1,否则 ALPN 可能被跳过) - 启用早期数据(HTTP/3 必需):
ssl_early_data on;
客户端识别与协议降级控制
仅服务端配置不够,还需让浏览器或客户端知道你支持哪些协议:
- 添加
Alt-Svc响应头,显式声明 HTTP/3 能力:add_header Alt-Svc 'h3=":443"; ma=2592000, h3-29=":443"; ma=2592000'; - 确保防火墙放行 UDP 443 端口(HTTP/3 依赖 UDP,TCP 443 开放不等于 HTTP/3 可用)
- 云服务商(如阿里云、腾讯云)安全组也必须单独放行 UDP 443
验证 ALPN 是否真正生效
语法正确 ≠ 协商成功。ALPN 失败时 Nginx 会静默回退到 HTTP/1.1,不报错:
- 浏览器 DevTools → Network → 刷新 → 右键表头勾选 Protocol,看请求是否显示
h2或h3 - 命令行验证 HTTP/2:
curl -I --http2 https://your-domain.com,返回HTTP/2 200且无重定向 - 验证 ALPN 通告:
openssl s_client -alpn h2 -connect your-domain.com:443 -servername your-domain.com 2>/dev/null | grep "ALPN protocol",应输出ALPN protocol: h2 - 验证 HTTP/3 支持:
curl -I --http3 https://your-domain.com(需 curl 7.64+)或使用 Chromechrome://net-internals/#quic











