Nginx upstream keepalive 真正起效需三者协同:合理设置 keepalive 数值(如后端 maxConnections=200 时设 120~160)、同步调优 keepalive_requests(推荐 1000~5000)和 keepalive_timeout(30~45s,须小于后端 idle timeout)、并在 proxy 层显式配置 proxy_http_version 1.1 和 proxy_set_header Connection ''。

要让 Nginx 的 upstream keepalive 真正起效,不是加一行 keepalive 32 就完事——它需要与后端承载能力、协议版本、请求头行为协同工作。调优连接池深度,本质是平衡复用率与资源开销,避免“池太小频繁建连”或“池太大空耗 socket”。
一、合理设置 keepalive 数值:看后端,不看并发峰值
keepalive 后的数字代表每个 worker 进程最多缓存多少个空闲长连接,不是总连接上限,也不是并发请求数的直接映射。
- 取值逻辑:建议设为「后端单实例稳定支撑的并发连接数 × 0.6~0.8」
- 例如 Tomcat 的
maxConnections=200,则keepalive 120~160更稳妥;若后端是 Node.js,默认maxConnections通常为 5000+,但实际受事件循环和 I/O 限制,建议先按 200~400 起步观察 - Windows 或低内存环境需更保守,32~64 是安全起点;切忌盲目设到 1000+,易触发系统级 fd 耗尽或内存抖动
二、配套参数必须同步调优:三个参数缺一不可
单独调大 keepalive 没用,keepalive_requests 和 keepalive_timeout 决定连接能否真正被复用、复用多久。
- keepalive_requests:默认 100 太小,高 QPS 场景下会频繁断连重连。推荐设为 1000~5000,尤其当后端支持 pipelining 或连接稳定性好时可设更高
-
keepalive_timeout:必须小于后端服务的 idle timeout。比如 Nginx 设 45s,Tomcat 的
connectionTimeout至少 60s,Node.js 的server.keepAliveTimeout至少 75s;生产中 30~45s 是较稳区间
三、proxy 层必须显式“打通协议路径”
upstream 配了 keepalive,但请求仍走 HTTP/1.0 或带 Connection: close,Nginx 会绕过连接池直连——这是最常被忽略的失效原因。
- location 块中必须写:
proxy_http_version 1.1; - 必须清除干扰头:
proxy_set_header Connection '';(注意是空字符串,不是keep-alive) - 可选但强烈建议:
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,保证后端日志与路由逻辑正常
四、验证是否生效:别信配置,要看连接状态
压测前先确认连接池是否真在工作,避免“纸面优化”。
- 运行
ss -tan | grep :后端端口 | grep ESTAB | wc -l,持续观察。若设keepalive 64,压测中连接数稳定在 50~64 区间,说明复用已生效;若一路飙升到几百,说明连接池未命中 - 用
tcpdump -i any port 后端端口 -nn -c 50抓包,重点看是否有大量重复 SYN → SYN-ACK 流程(短连接典型特征) - 对比开启前后:wrk -c 200 -t 4 -d 30s 压测,关注平均延迟下降幅度、后端
TIME_WAIT数量变化、Nginx worker CPU 使用率是否降低



















