要让Nginx负载均衡器真正支持HTTP/2分发,关键在于同时启用客户端→Nginx(listen 443 ssl http2)和Nginx→后端(proxy_pass https:// + proxy_http_version 2.0 + upstream keepalive)双链路HTTP/2,并确保TLS协商成功与连接复用生效。

要让 Nginx 负载均衡器真正支持 HTTP/2 分发,关键不是只在前端加 http2,而是打通“客户端 → Nginx”和“Nginx → 后端”两条链路的 HTTP/2,并确保连接复用生效。否则多路复用只停留在入口,无法延伸到后端集群。
前端监听启用 HTTP/2(Client → Nginx)
这是用户访问的第一跳,必须走 HTTPS,且需满足基础依赖:
- Nginx ≥ 1.9.5,OpenSSL ≥ 1.0.2(推荐 1.1.1+ 或 3.x)
- 使用有效 TLS 证书(自签名证书无法触发浏览器 HTTP/2 协商)
-
listen指令中明确写ssl http2,不能只写ssl - 禁用老旧协议:设置
ssl_protocols TLSv1.2 TLSv1.3;
后端代理启用 HTTP/2(Nginx → upstream)
默认情况下,proxy_pass http:// 始终走 HTTP/1.1;即使后端支持 HTTP/2,Nginx 也不会自动升级。必须显式配置:
- 后端地址必须是
https://(例如https://app1.example.com),不能是http:// - 在
location块中添加:proxy_http_version 2.0;proxy_set_header Connection '';proxy_set_header Upgrade ''; - 若后端启用了 ALPN 协商(如现代 Go/Node.js/gRPC 服务),可加
proxy_ssl_alpn h2;显式声明
保持长连接支撑多路复用
HTTP/2 的多路复用依赖稳定的复用连接。若每次请求都新建后端连接,就失去意义:
- 在
upstream块中启用连接池:keepalive 32;(建议值 16–64) - 配合
proxy_http_version 2.0,这些空闲连接才能承载多个并发 stream - 全局或 server 级别设
keepalive_timeout 75;,避免连接过早关闭 - 注意:
keepalive数值不宜过大(如超 100),防止后端连接数溢出
验证是否真正生效
仅看响应头显示 h2 不够,要确认“单连接多流”行为:
- 浏览器 DevTools → Network → 右键表头勾选 Protocol,观察多个资源是否共用同一 connection ID 并显示
h2 - 命令行验证协商:
curl -I --http2 https://your-domain.com - 检查配置是否加载:
nginx -T | grep -A5 "listen.*http2" - 后端日志或抓包(如 Wireshark)观察是否出现交错的 HEADERS/DATA 帧
不复杂但容易忽略:HTTP/2 在负载均衡场景下,核心价值在于减少连接开销与头部体积,而非强依赖服务端推送——生产中建议保持 http2_push off;,避免资源误推引发缓存混乱。

















