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,再考虑调优参数。