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 的多路复用能力,关键不是只在 listen 指令加 http2,而是必须打通“客户端 → Nginx”和“Nginx → 后端”两个链路的 HTTP/2 支持,并合理配置连接复用机制。否则,即便前端是 HTTP/2,后端仍走 HTTP/1.1,多路复用就只停留在入口,无法延伸到服务集群内部。
启用监听端口的 HTTP/2(客户端到 Nginx)
这是用户访问的第一环,必须使用 HTTPS(HTTP/2 强制要求 TLS),且 OpenSSL 和 Nginx 版本需满足最低要求(OpenSSL ≥ 1.0.2、Nginx ≥ 1.9.5):
- 确保已配置有效的 SSL 证书(自签名不可用于浏览器协商 HTTP/2)
-
listen 443 ssl http2;是必需写法,不能只写ssl - 推荐启用 TLS 1.2+ 和现代 cipher suite,避免因协议降级导致 HTTP/2 协商失败
配置 upstream 的 HTTP/2 代理(Nginx 到后端)
默认情况下,proxy_pass http://... 会使用 HTTP/1.1;若后端支持 HTTP/2,必须显式升级协议:
- 后端地址必须为
https://(而非http://),例如:proxy_pass https://backend; - 在 upstream 块中定义的服务器需支持 TLS 并开启 HTTP/2(如 gRPC 服务、或启用了 HTTP/2 的 Node.js/Go 后端)
- 添加必要 header 清理,防止 HTTP/1.1 兼容头干扰:
proxy_set_header Connection '';
proxy_set_header Upgrade '';
保持长连接以支撑多路复用效果
HTTP/2 的多路复用依赖稳定、复用的底层 TCP 连接。若每次请求都新建后端连接,就失去复用意义:
- 在 upstream 块中启用
keepalive N;(如keepalive 32;),维持与后端的空闲连接池 - 配合
proxy_http_version 2.0,这些 keepalive 连接将承载多个并发 stream - 注意:keepalive 数值不宜过大(一般 ≤ 100),避免后端连接数超限;也不宜过小(如
keepalive 2),否则池太浅,频繁建连
验证多路复用是否生效
光看响应头 HTTP/2 200 不够,要确认“单连接多流”行为:
- 浏览器开发者工具 → Network → 右键表头 → 勾选
Protocol列,观察多个资源是否显示h2 - 用
curl -I --http2 https://your-domain.com确认协议协商成功 - 后端日志或 Wireshark 抓包可看到同一 TCP 连接上交错传输多个 HEADERS + DATA 帧(Frame 层面)
- 若所有请求都走不同 connection ID,说明 keepalive 或协议升级未生效


















