核心目的是主动移除客户端传来的connection头以避免干扰后端keep-alive复用;需配合proxy_http_version 1.1和upstream keepalive才能生效。

使用 proxy_set_header Connection "" 的核心目的,不是“清空头部”,而是**主动移除客户端传来的 Connection 头部**,避免它干扰 Nginx 与后端(尤其是 HTTPS 后端)之间的 HTTP/1.1 Keep-Alive 复用。这能减少建连开销,提升响应速度。
为什么需要显式设置 Connection ""
Nginx 默认会将客户端请求中的 Connection 头(如 Connection: close 或 Connection: keep-alive)原样转发给后端。但后端(比如上游的 HTTPS Node.js、Spring Boot 或另一个 Nginx)可能不信任或不处理该头,尤其当它值为 close 时,会导致后端主动断连,无法复用连接。设为 "" 表示“不传递该头”,让后端按自身策略决定是否保持长连接。
- HTTP/1.1 规范规定:没有
Connection头时,默认启用 Keep-Alive - 若后端是 HTTPS,TLS 层本身不关心
Connection,但应用层协议栈(如 Go net/http、Java Undertow)仍会解析该头并影响连接管理 - 不设置此项时,某些客户端(如旧版 curl、特定 SDK)可能带
Connection: close,意外破坏连接池
配合 Keepalive 必须做的其他配置
单设 Connection "" 不足以保障长连接畅通,需与 upstream 的 keepalive 参数协同:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在
upstream块中启用连接池:keepalive 32;(表示每个 worker 最多缓存 32 个空闲连接) - 在
location或server中设置代理头:proxy_http_version 1.1;(强制用 HTTP/1.1,支持 Keep-Alive) - 确保后端响应含
Connection: keep-alive或无该头(Nginx 默认不添加,依赖后端输出) - 可选但推荐:
proxy_set_header Proxy-Connection "";(清除可能存在的代理链遗留头)
典型安全后端场景配置示例
假设后端是 HTTPS 服务(如 https://api.example.com),配置应类似:
upstream backend {
server api.example.com:443;
keepalive 50;
}
<p>server {
location /api/ {
proxy_pass <a href="https://www.php.cn/link/0e2f55a256a7218367349b9e87657252">https://www.php.cn/link/0e2f55a256a7218367349b9e87657252</a>;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Proxy-Connection "";
proxy_set_header Host $host;
proxy_ssl_server_name on; # 关键:启用 SNI,确保证书匹配
}
}</p>
注意:proxy_ssl_server_name on 对加密后端必不可少,否则 TLS 握手可能失败,间接导致连接无法复用。
验证是否生效的方法
不要只看配置,要实测连接复用效果:
- 用
curl -v https://your-nginx/api/test查看响应头是否有Connection: keep-alive,且无Connection: close - 用
ss -tnp | grep :443观察 Nginx worker 进程是否维持多个 ESTABLISHED 状态到后端 IP(说明连接池在工作) - 压测时对比开启/关闭
keepalive和Connection ""的平均延迟和 TIME_WAIT 数量 - 后端日志中检查是否出现频繁新建连接(如 Node.js 的
connection create日志)










