需手动设置 connection 头,因 nginx 默认按 rfc 7230 清理 hop-by-hop 头(含 connection),导致后端误判为短连接;正确做法是 proxy_set_header connection '' 并配 proxy_http_version 1.1。

在 Nginx 作为反向代理时,若后端服务(如 Node.js、Tomcat、Go HTTP Server)依赖 HTTP/1.1 的 Connection: keep-alive 来复用 TCP 连接,就必须显式配置 proxy_set_header Connection,否则 Nginx 默认会清除或改写该头,导致长连接被中断。
为什么需要手动设置 Connection 头?
Nginx 默认对上游请求执行“hop-by-hop”头清理,Connection 正属于这类头(RFC 7230 规定它不被转发)。如果不干预,Nginx 会删掉客户端发来的 Connection: keep-alive,且不主动添加,导致后端误认为这是短连接请求,每次响应后关闭 TCP 连接。
正确配置 Connection 头的方法
在 location 或 server 块中添加以下指令:
proxy_set_header Connection '';
这个空字符串写法是关键:它告诉 Nginx 不要发送 Connection 头(避免传入可能的 close),同时也不删除客户端原始值 —— 实际效果等价于透传。更稳妥的做法是结合 $connection_upgrade 变量(尤其配合 WebSocket):
- 对于普通 HTTP 长连接:
proxy_set_header Connection ''; - 若需支持 WebSocket 升级:
proxy_set_header Connection $connection_upgrade;,并搭配map块定义变量(见下文) - 务必同时设置:
proxy_http_version 1.1;(启用 HTTP/1.1 是 keep-alive 前提)
WebSocket 场景下的完整示例
当代理 WebSocket 时,需识别 Upgrade 请求头并透传 Connection: upgrade:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
然后在 location 中:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;
这样既支持常规 keep-alive,也兼容 WebSocket 握手。
验证是否生效
用 curl 检查响应头:
curl -I http://your-nginx-domain/api/test
观察后端返回的响应中是否有 Connection: keep-alive;再用 tcpdump 或浏览器 DevTools 的 Network → Timing 标签,确认复用的是同一 TCP 连接(Reused connection 或 connection ID 不变)。










