nginx复用后端tcp连接需同时配置upstream keepalive、proxy_http_version 1.1和proxy_set_header connection "";keepalive值按后端并发能力×0.6~0.8设定,并配合keepalive_requests与keepalive_timeout合理控制连接生命周期。

要在 Linux 上让 Nginx 真正复用到后端的 TCP 连接,不能只写 keepalive 32,必须同时配齐三要素:upstream 块中的 keepalive、location 中的 proxy_http_version 1.1 和 proxy_set_header Connection ""。缺一不可,否则连接仍是短连,TIME_WAIT 激增,延迟难降。
upstream 块里正确声明 keepalive
该指令只能出现在 http 块下的 upstream 定义中,不能嵌套在 server 或 location 里,否则启动报错 unknown directive "keepalive"。
-
keepalive N表示每个 worker 进程对**单台后端服务器**最多缓存 N 个空闲长连接 - 若你有 4 个 worker、2 台后端,理论最大空闲连接数为
4 × 2 × N - N 值建议按后端单实例稳定并发能力 × 0.6~0.8 估算:Tomcat
maxConnections=200→ 设 120~160;Node.js 轻量服务可从 32~64 起步 - 避免拍脑袋设值,可按
(预估峰值并发 ÷ worker_processes) × 1.2反推,比如并发 5000、4 个 worker,初始设 1500
location 中强制启用 HTTP/1.1 并清空 Connection 头
仅配置 keepalive 不生效——Nginx 默认向上游发 HTTP/1.0 请求,不支持复用连接。
- 必须加
proxy_http_version 1.1;,升级协议语义 - 必须加
proxy_set_header Connection "";,清空客户端可能传来的Connection: close等干扰头 - 不要手动加
Keep-Alive头,Nginx 会根据连接池状态自动处理 - 这两行需放在所有
proxy_pass所在的location块内,且对所有转发请求生效
合理设置 upstream 连接生命周期参数
keepalive_requests 和 keepalive_timeout 控制的是 upstream 连接池中单个空闲连接的行为(Nginx 1.15.3+ 才生效),不是客户端连接参数。
-
keepalive_requests 500;:单个空闲连接最多转发 500 次请求后主动关闭,防后端状态泄漏;API 场景推荐 500~1000(默认 100 太保守) -
keepalive_timeout 20s;:空闲连接在池中最多保留 20 秒;建议比后端空闲超时(如 Tomcat 的connectionTimeout)小 5~10 秒,避免持有已失效连接 - 注意:
keepalive_timeout和keepalive_requests写在http或server块里时,只影响「浏览器 → Nginx」链路,对 upstream 完全无效
验证是否真正生效
配置完成不等于跑通,必须实测确认:
- 执行
ss -tnp | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期范围,而非剧烈波动或持续增长 - 压测对比开启前后:后端
TIME_WAIT数量、P95 延迟、建连耗时变化 - 检查后端响应头是否含
Connection: keep-alive;若返回close或缺失,说明后端未配合或中间设备干扰











