proxy_set_header connection ""的核心目的是主动移除客户端的connection头,防止其透传干扰nginx与上游服务间的http keepalive连接复用;必须配合proxy_http_version 1.1和upstream keepalive n才能生效。

使用 proxy_set_header Connection "" 的核心目的不是“清空头部”,而是**主动移除客户端发来的 Connection 头**,避免它被透传给后端服务,从而干扰 Nginx 与上游(upstream)之间的 HTTP Keepalive 连接复用。
为什么需要显式设置 Connection ""?
Nginx 默认会将客户端请求中的 Connection 头(如 Connection: keep-alive 或 Connection: close)原样转发给后端。但这个头对 Nginx 自身的 upstream 连接管理没有意义,反而可能触发后端错误解析——尤其当后端是 HTTP/1.1 服务且严格遵循 RFC 时,收到 Connection: close 可能导致它主动断开长连接,破坏 Nginx 配置的 keepalive 复用机制。
设为空字符串 "" 表示“不发送该头”,等效于在代理请求中彻底删除它。
必须配合 upstream keepalive 参数才有效
仅加 proxy_set_header Connection "" 不足以启用长连接复用,还需在 upstream 块中正确配置连接池:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
启用连接池:用
keepalive N;(如keepalive 32;),表示每个 worker 进程最多缓存 N 个空闲到后端的 keepalive 连接 -
禁用关闭提示:在
location或server块中添加proxy_http_version 1.1;和proxy_set_header Connection ""; -
可选但推荐:加上
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;等,确保后端获取真实信息
典型配置示例
以下是最小可行配置(以代理到本地 Flask 应用为例):
upstream backend {
server 127.0.0.1:5000;
keepalive 32; # 关键:启用 upstream 连接复用
}
<p>server {
listen 80;
location / {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_http_version 1.1; # 必须为 1.1 才支持 keepalive
proxy_set_header Connection ""; # 移除客户端 Connection 头,防干扰
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}</p>
注意:proxy_http_version 1.1 是前提,否则 Nginx 默认用 HTTP/1.0 发起 upstream 请求,根本不会尝试复用连接。
验证是否生效
可通过以下方式确认 keepalive 已起作用:
- 查看 Nginx
error.log中是否有upstream sent too big header或连接重置日志(异常时常见) - 用
ss -tnp | grep :5000观察到大量ESTABLISHED状态的连接长期存在,而非每次请求都新建/关闭 - 后端 access log 中同一 IP 的请求时间戳密集但连接数增长缓慢,说明连接被复用
响应时间下降主要来自省去了 TCP 握手 + TLS 握手(若启用 HTTPS)+ HTTP request setup 开销,实测在高并发短请求场景下可降低 10–40ms 延迟。










