要让Nginx upstream真正支持HTTP/2多路复用回源,必须三者协同:upstream块中显式声明http2指令(Nginx≥1.9.13)、proxy_pass使用https://前缀并配proxy_http_version 1.1、keepalive设为4–16且启用proxy_ssl_session_reuse on及TLS统一配置。

要让 Nginx 的 upstream 块真正支持 HTTP/2 多路复用回源,不能只改一两个参数。核心在于协议显式启用、连接复用策略适配、TLS 协商一致,三者缺一不可。
必须在 upstream 中声明 http2 指令
默认情况下,Nginx 与后端通信始终走 HTTP/1.1。即使后端监听 8443 并支持 HTTP/2,upstream 块里只写 server 192.168.1.100:8443; 是无效的。
- 需明确添加
http2;指令,且 Nginx 版本 ≥ 1.9.13 - 后端地址语义上必须是 HTTPS 端点(如 8443),但 upstream 内不写协议,仅写 IP:PORT
- 对应 server 块中
proxy_pass必须用https://前缀,例如proxy_pass https://backend_http2; - 若后端不支持 HTTP/2,Nginx 自动降级为 HTTP/1.1,无报错但失去多路复用优势
调整 keepalive 数量匹配多路复用特性
HTTP/2 的单连接可并发处理数十个请求,不再需要维持大量长连接。keepalive 值过高反而增加后端压力,过低则频繁建连,抵消复用收益。
- 推荐值范围:4~16,常见设为
keepalive 8;或keepalive 12; - 该值指每个 worker 进程与每个 upstream server 保持的空闲连接数
- 务必配合
proxy_http_version 1.1;(不是 2.0)和proxy_set_header Connection '';,这是 Nginx 当前对 HTTP/2 连接复用的兼容要求
确保 TLS 层完全协同才能复用会话
HTTP/2 强制依赖 TLS,而高效回源的关键是 TLS 会话复用(session reuse)。它能把建连耗时从 2–3 RTT 降到 1 RTT。
- 在 upstream 块内启用:
proxy_ssl_session_reuse on; - 开启 SNI 支持:
proxy_ssl_server_name on;(尤其后端是域名且共用 IP 时) - 统一 TLS 版本:
proxy_ssl_protocols TLSv1.2 TLSv1.3;,禁用旧版本 - 后端若启用 session ticket,所有节点必须共享同一
ssl_session_ticket_key - 日志中可通过
$upstream_ssl_session_reused变量验证,r表示复用成功
清理干扰头并确认后端响应行为
HTTP/1.1 兼容头可能破坏 HTTP/2 流控机制,同时后端返回的连接策略直接影响 Nginx 是否断连。
- 清除升级相关头:
proxy_set_header Upgrade '';和proxy_set_header Connection ''; - 确保后端响应中包含
Connection: keep-alive;若返回Connection: close,Nginx 将主动关闭连接,复用立即失效 - 后端证书需可信;测试环境可临时加
proxy_ssl_verify off;,但生产环境必须校验


















