必须配置proxy_set_header connection "",因为nginx默认透传客户端connection头(如close),导致后端误判而断连;清空后由http/1.1协议自主决定复用,但须与proxy_http_version 1.1和upstream keepalive n配套生效。

要让 Nginx 与后端建立并复用 HTTP/1.1 长连接,Connection 请求头必须清空,即配置为 proxy_set_header Connection "" —— 这不是可选项,而是强制要求。填 "keep-alive" 或 "close" 都会破坏长连接,甚至导致后端主动断连。
为什么必须设为空字符串?
Nginx 默认会透传客户端发来的 Connection 头(比如 Connection: close),而后端服务看到这个头,就会在响应后立即关闭连接。清空该头,等于告诉后端:“别看客户端怎么写的,这次由你按 HTTP/1.1 规则自行决定是否保持连接”。HTTP/1.1 默认就是持久连接,后端自然复用 TCP 连接。
- 填
"keep-alive":多数后端(如 Node.js、Go Gin、Spring Boot)会误判为“客户端要求关闭”,反而出Connection: close响应 - 填
"close"或不配置:Nginx 直接转发原始头,后端收到就断连 - 留空
"":彻底移除该请求头,让后端基于协议版本自主决策
必须配套的两项配置
单设 Connection "" 不够,它必须和以下两项一起生效:
-
proxy_http_version 1.1;:写在location块里,强制 Nginx 用 HTTP/1.1 向后端发起请求;HTTP/1.0 没有标准的 keep-alive 机制,设了也白设 -
upstream { keepalive 32; }:定义每个 worker 进程最多缓存 32 个空闲连接;不定义 upstream、只写proxy_pass http://ip:port,keepalive指令完全无效
常见错误写法
这些配置看似合理,实际都会让长连接失效:
-
proxy_set_header Connection "keep-alive";→ 后端可能拒绝复用 -
proxy_set_header Connection $http_connection;→ 把客户端的close原样传过去 - 把
proxy_http_version 1.1写在upstream或server块里 → Nginx 忽略或报错 - 没配
keepalive却指望连接复用 → Nginx 每次都新建后端连接
验证是否生效
可通过后端日志或 ss -tnp | grep :端口 观察连接状态:若同一后端 IP 出现多个 ESTABLISHED 连接且长时间存在,说明连接池已启用;若连接数随请求数线性增长、很快变为 CLOSE_WAIT,说明长连接未生效。











