必须显式配置 proxy_http_version 1.1,因nginx默认用http/1.0代理,不支持持久连接;需同步清空connection头、启用upstream keepalive连接池,并确认后端支持keep-alive。

必须显式配置 proxy_http_version 1.1,这是开启后端链路复用的协议基础——Nginx 默认以 HTTP/1.0 代理请求,而 HTTP/1.0 不支持持久连接,即使客户端带 Connection: keep-alive,Nginx 也不会复用 TCP 连接。
为什么非设为 1.1 不可
HTTP/1.0 协议本身不定义持久连接语义,Nginx 在该模式下:
- 不会在发往后端的请求头中添加或保留 Connection: keep-alive
- 忽略后端返回的 Keep-Alive: timeout=60, max=100 响应头
- 每次响应结束即主动关闭 TCP 连接,无法归还至连接池
只有启用 HTTP/1.1,Nginx 才具备识别、传递和管理长连接的能力,为后续复用提供协议前提。
配套三项关键动作缺一不可
单设 proxy_http_version 1.1 只是起点,还需同步完成:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
清空 Connection 头:加
proxy_set_header Connection "",避免把客户端传来的Connection: close或其他异常值透传给后端,干扰其长连接判断 -
启用 upstream 连接池:在
upstream块中配置keepalive N(如keepalive 32),表示每个 worker 进程最多缓存 N 个空闲连接供复用 -
确认后端支持 keep-alive:例如 Tomcat 需设置
connectionTimeout为非零值;Node.js 默认支持,但需确保未在代码中显式调用req.socket.destroy()等强制断连操作
典型 location 配置片段
以下是最小可行配置,直接放在 location 块内即可生效:
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
注意:proxy_http_version 1.1 必须写在 proxy_pass 后面,且不能被其他条件覆盖(如嵌套 if 块中未重复声明)。
验证是否真正复用
仅看配置不等于生效,建议通过实际观测确认:
- 抓包比对:用 tcpdump 或 Wireshark 抓取 Nginx 到后端的流量,观察同一客户端 IP:Port 与某台后端服务器之间,多个 HTTP 请求是否复用同一个 TCP 连接(SYN/FIN 包数量远少于请求总数)
-
查看 Nginx 连接状态:启用
stub_status模块,访问/nginx_status,关注Active connections和Reading/Writing/Waiting中的Waiting数值是否稳定,而非持续飙升后突降 - 后端日志辅助判断:若后端记录连接建立时间或 socket ID,可对比相邻请求是否共享同一连接标识










