要让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/1.1,起不到优化效果。
启用客户端到 Nginx 的 HTTP/2
这是用户访问的第一环,必须满足三个前提:
- 使用 HTTPS:HTTP/2 强制要求 TLS,不能用纯 HTTP
- 配置有效证书:自签名证书无法在浏览器完成 HTTP/2 协商
- 监听指令明确声明:
listen 443 ssl http2;(仅写ssl不够)
建议搭配 TLS 1.2+ 和现代 cipher suite,避免协议降级导致协商失败。
配置 Nginx 到后端的 HTTP/2 代理
关键不是“支持 HTTP/2”,而是“让 Nginx 主动用 HTTP/2 去连后端”:
- 后端地址必须是
https://,例如:proxy_pass https://backend; - upstream 中需启用 keepalive:
keepalive 32;(建议 16–64,不宜超 100) - 显式升级协议:
proxy_http_version 2.0; - 清除干扰头:
proxy_set_header Connection '';和proxy_set_header Upgrade '';
注意:后端服务本身也必须支持 HTTP/2(如启用了 HTTP/2 的 Go/Node.js 服务,或 gRPC 后端)。
协同配置连接复用参数
HTTP/2 多路复用依赖底层 TCP 连接的稳定复用,不是开个开关就自动生效:
- 每个 worker 进程独立维护连接池,总空闲连接数 ≈ worker 数 ×
keepalive值 -
proxy_connect_timeout控制建连耗时,建议设为 1–3 秒 -
proxy_read_timeout和proxy_send_timeout应略大于后端平均响应时间(如后端平均 8s,可设 15–25s) - 确保后端自身的 keepalive timeout > Nginx 的
proxy_read_timeout,否则连接会被后端先断开
验证是否真正实现多路复用
不能只看响应头是不是 HTTP/2 200,要看“单连接承载多流”:
- 浏览器开发者工具 → Network → 右键表头勾选 Protocol,多个请求都显示
h2是基础 - 进一步确认:多个资源共用同一个 connection ID(可通过 Wireshark 抓包观察 HEADERS + DATA 帧交错传输)
- curl 验证:
curl -I --http2 https://your-domain.com看是否协商成功 - 如果每个请求都新建 connection,说明 upstream keepalive 未生效或协议未升级











