首页/安全/加密与证书速查/HTTP/2 启用与排查
TLS 与 HTTPS60 条

HTTP/2 启用与排查

浏览器中的 HTTP/2 通过 ALPN 协商(h2),排查先确认服务端启用且协商成功,再检查回源链路与代理是否降级为 HTTP/1.1。

加密与证书速查安全更新于 2026-10-13

HTTP/2 启用与排查

浏览器中的 HTTP/2 通过 TLS 的 ALPN 扩展协商,标识为 h2。因此排查顺序是:先确认服务端已启用并协商成功,再检查回源链路与中间代理是否把协议降级为 HTTP/1.1。需要留意的是,明文场景下浏览器并不使用 h2,只有基于 TLS 的连接才具备这个能力,这一点在排查时经常被忽略。

基本信息

协商检查s_client -alpn h2 观察 ALPN 结果
nginx 指令1.25.1 起使用 http2 on,旧版本写在 listen 参数中
回源限制proxy_pass 默认走 HTTP/1.x,上游 h2 需要额外支持
排查工具curl --http2 与 -w '%{http_version}' 组合
常见降级点中间代理、负载均衡、CDN 配置

典型使用场景

  • 启用 HTTP/2 后验证是否真的协商到 h2
  • 排查性能未改善:实际仍在走 HTTP/1.1
  • 升级 nginx 后指令写法变化导致的配置问题
  • 客户端与回源协议不一致引发的排查
  • 压测结论与生产表现不一致时核对协议版本

验证 h2 协商

验证 h2 协商
openssl s_client -connect example.com:443 -servername example.com -alpn h2 </dev/null 2>&1 | grep -i 'ALPN'
curl -sI --http2 https://example.com/ | head -3
curl -so /dev/null -w 'http_version=%{http_version}\n' https://example.com/
nginx -T | grep -nE 'listen .*443|http2'      # 查看实际生效的指令

协议与协商

项目取值说明
客户端协议h2浏览器基于 TLS 协商
明文场景h2c浏览器不支持,仅部分工具使用
回源协议HTTP/1.1(默认)nginx 到上游的默认行为
验证方式ALPN 与 curl 输出两者结合确认端到端结果
升级 nginx 前后要注意 http2 指令的兼容性:1.25.1 起推荐使用 http2 on,旧写法在新版本上会告警或行为变化。变更后用 nginx -t 校验配置,并重新复测协商结果,不要只确认配置文件被加载。
排查顺序建议:先用 curl 确认客户端侧是否协商到 h2,再用 s_client -alpn 看服务端接受哪些协议,最后检查中间代理与回源的协议版本。三个环节任一处降级,最终结果都会退回 HTTP/1.1,而报错信息通常不会直接指出是哪一段出了问题。
验收建议:把「客户端协商版本、服务端接受的 ALPN 列表、回源协议」三项结果列成一张对照表留存,后续变更时可直接比对。若性能提升不达预期,先看这张表有没有哪一项退回了 HTTP/1.1,再考虑调优参数。

易错点

  • 改完配置只重启服务不检查 ALPN → 以为启用了 h2,实际仍在用 HTTP/1.1
  • 以为明文场景也能用 h2 → 浏览器只在 TLS 上协商 h2,h2c 需要专门客户端
  • 忽略中间代理的降级 → 端到端协议不一致,性能优化的预期落空
  • 沿用旧指令写法升级 nginx → 配置告警或行为变化,排查时容易被忽略

数据来源与参考

  • RFC 9113(HTTP/2)
  • nginx 官方文档(ngx_http_v2_module)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌