Nginx upstream 连接复用需协议、头部、连接池三者对齐:upstream 块内配 keepalive N,location 中设 proxy_http_version 1.1 和 proxy_set_header Connection "",并配合 keepalive_requests 与 keepalive_timeout,最后通过 ss 命令及压测验证。

要让 Nginx 的 upstream 真正复用连接、避免频繁建连,不能只写一行 keepalive 32。必须协议、头部、连接池三者对齐,否则配置等于没配。
upstream 块内正确声明 keepalive
该指令只能出现在 upstream 块中,且必须定义在 http 块下,不能嵌套在 server 或 location 里,否则启动报错:unknown directive "keepalive"。
-
keepalive N表示每个 worker 进程为该 upstream 中的每台后端最多缓存 N 个空闲长连接 - 若你有 4 个 worker、2 台后端,理论最大空闲连接数是
4 × 2 × N - N 值建议按后端单实例稳定并发 × 0.6~0.8 计算:Tomcat(maxConnections=200)可设 120~160;轻量服务(如 Node.js)可从 32~64 起步
location 中强制启用 HTTP/1.1 并清空 Connection 头
仅 upstream 配了 keepalive,但 proxy_pass 仍发 HTTP/1.0 请求或透传 Connection: close,后端就会断连——连接池完全失效。
-
proxy_http_version 1.1;:强制使用支持复用的协议版本 -
proxy_set_header Connection "";:清空客户端传来的 Connection 头,防止误传close - 不要手动加
Keep-Alive头,Nginx 会根据连接池状态自动处理
配套设置 keepalive_requests 和 keepalive_timeout
这两个参数控制 upstream 连接池中单个连接的生命周期,从 Nginx 1.15.3+ 开始才对 upstream 生效。
-
keepalive_requests 500;:单个空闲连接最多转发 500 次请求后关闭,防后端状态泄漏;API 场景推荐 500~1000 -
keepalive_timeout 20s;:空闲连接在池中最多保留 20 秒;建议比后端空闲超时(如 Tomcat 的connectionTimeout)小 5~10 秒
验证是否真正生效
配置写完不等于跑通,必须实测确认:
- 执行
ss -tnp | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期值附近,而非持续增长或剧烈波动 - 压测对比开启前后:后端
TIME_WAIT数量、P95 延迟、建连耗时 - 检查后端响应头是否含
Connection: keep-alive;若返回close或缺失,说明后端未配合或中间设备干扰



















