要让nginx轮询负载均衡支持http/2后端转发,必须在upstream中为每个server显式添加http2指令、使用https://地址、配置keepalive,并在location中设proxy_http_version 2.0及清除upgrade/connection头。

要让 Nginx 轮询负载均衡真正支持 HTTP/2 后端协议转发,核心不是只改前端监听,而是确保“Nginx → 后端”这一跳走 HTTP/2,且连接可复用。轮询本身(upstream 中默认行为)不受影响,但必须配合明确的 HTTP/2 代理配置,否则默认仍走 HTTP/1.1。
后端地址必须是 https:// 并启用 http2 指令
Nginx 不会自动升级协议,必须显式声明后端支持 HTTP/2:
-
upstream 块中每个 server 必须写明 HTTPS 端口,并加
http2指令,例如:upstream backend {<br> server app1.example.com:8443 http2;<br> server app2.example.com:8443 http2;<br> keepalive 32;<br>} - 低于 Nginx 1.9.13 的版本不支持
http2指令,配置无效;建议使用 1.20+ 或最新稳定版 - 后端服务自身需监听 TLS 端口(如 8443),并启用 ALPN 协商 h2(Go、Node.js、gRPC 默认支持,Nginx 自身不提供 HTTP/2 服务端能力)
proxy_pass 和请求头需匹配 HTTP/2 要求
location 块中不能沿用 HTTP/1.1 的默认行为:
-
proxy_pass必须以https://开头,对应 upstream 中定义的 HTTPS 地址 - 显式设置
proxy_http_version 2.0(注意不是 1.1) - 清除 HTTP/1.1 兼容头:
proxy_set_header Connection '';和proxy_set_header Upgrade ''; - 若后端严格依赖 ALPN,可加
proxy_ssl_alpn h2;显式协商
保持连接池支撑多路复用
HTTP/2 的价值在于单连接多 stream,这依赖稳定的长连接池:
-
upstream中keepalive 32是关键——它维持空闲 HTTPS 连接,供多个并发 stream 复用 - 避免设过大(如 >64),防止后端连接数溢出;也不宜过小(如
- 建议搭配
proxy_ssl_verify off;(若用私有证书)或完整证书链验证,避免 TLS 握手失败中断复用
验证是否真正生效
仅看响应头含 h2 不够,要确认后端确实在用 HTTP/2 处理:
- 浏览器 DevTools → Network → 勾选 Protocol 列,观察资源是否共用 connection ID 且标记为
h2(这是客户端→Nginx) - 后端日志或 Wireshark 抓包,检查 Nginx 发出的帧是否为
HEADERS/DATA(非HTTP/1.1文本格式) - 命令行验证后端链路:
curl -I --http2 -k https://app1.example.com(直连后端,绕过 Nginx)











