需清理connection头以支持上游长连接池,因它是逐跳头,透传会导致后端错误关闭连接或中断websocket升级;应配置proxy_set_header connection '';、proxy_set_header keep-alive '';,并配合proxy_http_version 1.1;和upstream keepalive指令。

要通过 proxy_set_header 清理 Connection 头以支持上游长连接池,核心是让 Nginx 主动移除或重写客户端发来的 Connection 和 Keep-Alive 等逐跳(hop-by-hop)头部,避免它们干扰后端服务的连接复用判断。
为什么需要清理 Connection 头
HTTP/1.1 中 Connection 是逐跳头部,不应被代理透传。若客户端带 Connection: close 或 Connection: upgrade,Nginx 若原样转发给上游,可能导致后端错误关闭连接、拒绝复用,甚至中断 WebSocket 升级。长连接池(如 upstream 的 keepalive 指令启用时)依赖稳定的 HTTP 连接生命周期,必须确保该头不干扰后端的 keepalive 决策。
正确配置 proxy_set_header 清理 Connection
Nginx 默认已将 Connection 设为“清除项”,但显式声明更安全可靠。需在 location 或 upstream 块中设置:
- 用
proxy_set_header Connection '';将其设为空字符串,等效于彻底删除该头 - 同时清除
Keep-Alive(也是逐跳头):proxy_set_header Keep-Alive ''; - 若涉及 WebSocket,还需透传
Upgrade和Connection: upgrade,但仅限特定 location(如location /ws/),不可全局清理
配合 upstream keepalive 实现连接池
仅清理 header 不够,还需启用上游长连接池:
- 在
upstream块中添加keepalive 32;(数字为最大空闲连接数) - 对应 location 中必须设置
proxy_http_version 1.1;(因 HTTP/1.0 不支持 keepalive) - 加上
proxy_set_header Connection '';,确保请求发往 upstream 时不携带干扰头 - 可选:加
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;等,保持语义清晰
验证是否生效
可通过以下方式确认清理成功:
- 用
curl -v http://nginx-proxy/path查看请求头,确认无Connection字段发出 - 在 upstream 服务侧(如 Node.js/Python 日志)打印收到的 headers,确认未收到
Connection - 用
ss -tan | grep :your_upstream_port观察 ESTABLISHED 连接是否复用、数量稳定而非频繁新建/关闭
不复杂但容易忽略。关键是把 Connection 彻底清空,并与 proxy_http_version 1.1 和 upstream keepalive 配合使用,才能真正释放长连接池的性能价值。











