upstream块需显式启用http/2:必须添加http2指令(nginx 1.9.13+支持),server地址须对应https端点(如:8443),proxy_pass使用https://前缀,并配合proxy_http_version 1.1、proxy_set_header connection ''等配置实现端到端http/2。

明确 upstream 块需显式启用 HTTP/2
默认情况下,Nginx upstream 与后端通信始终使用 HTTP/1.1。要实现端到端 HTTP/2 转发(即客户端 → Nginx → 后端全程 HTTP/2),必须在 upstream 定义中添加 http2 指令,且后端服务本身必须支持 HTTP/2(通常监听 HTTPS 端口如 8443,并配置 ALPN 协议协商)。
- upstream 块中仅写
server 192.168.1.100:8443;不足以触发 HTTP/2,必须补上http2; - Nginx 1.9.13+ 才支持该指令;低于此版本即使配置也无效
- 若后端不支持 HTTP/2,Nginx 会自动降级为 HTTP/1.1,不会报错但无法享受多路复用等优势
匹配协议与 TLS 配置一致性
HTTP/2 在 Nginx 中强制要求 TLS(即必须走 HTTPS),因此 upstream 中的 server 地址必须是 https:// 协议前缀(实际配置中 proxy_pass 使用 https,upstream 定义仍只写 IP:PORT,但语义上代表 HTTPS 端点)。
- upstream 定义不写协议,只写地址:
server 192.168.1.100:8443; - 对应 server 块中的
proxy_pass https://backend_http2;才能触发 HTTP/2 上游通信 - 务必确保后端证书可信(或在 Nginx 中配置
proxy_ssl_verify off;用于测试环境),否则连接将失败 - 推荐启用
proxy_ssl_server_name on;支持 SNI,便于多域名后端复用同一 IP
调整 keepalive 与连接复用策略
HTTP/2 的多路复用特性改变了连接管理逻辑:单个连接可并发处理数十甚至上百请求,因此无需维持大量长连接,keepalive 数量应显著低于 HTTP/1.1 场景。
- HTTP/1.1 常见配置:
keepalive 32; - HTTP/2 推荐配置:
keepalive 8;或keepalive 4;,视并发请求数和后端承载能力而定 - 必须配合
proxy_http_version 1.1;(注意:不是 2.0!Nginx 当前 proxy_http_version 指令仅控制发送给 upstream 的请求版本,设为 1.1 是为了兼容 HTTP/2 连接复用机制) - 添加
proxy_set_header Connection '';清除 Connection 头,避免干扰 HTTP/2 流控
验证与常见问题排查
配置生效后,需从三方面确认 HTTP/2 端到端是否真正建立:
- 检查 Nginx error 日志:出现
"upstream sent invalid response"或"SSL_do_handshake() failed"多因证书或 ALPN 不匹配 - 用
openssl s_client -connect 192.168.1.100:8443 -alpn h2直连后端,确认其支持 h2 协议 - 在后端服务日志中查看请求协议字段(如 Node.js 的
req.httpVersion应为2.0) - 禁用浏览器缓存并使用 curl 测试:
curl -I --http2 -k https://api.example.com,观察响应头是否含Alt-Svc或直接返回 HTTP/2 状态行











