nginx upstream keepalive 真正生效需连接池、协议层、后端行为三者对齐:upstream 块中配 keepalive n,location 中设 proxy_http_version 1.1 和 proxy_set_header connection "",并合理设置 keepalive_timeout 与 keepalive_requests,且后端空闲超时须大于 nginx 配置值。

要让 Nginx 的 upstream keepalive 真正生效,不是加一行 keepalive 32 就完事,而是必须让连接池、协议层、后端行为三者对齐。配置错一个环节,连接照样频繁新建,TIME_WAIT 暴涨,QPS 上不去。
upstream 块里必须写对位置和数值
keepalive 指令只能出现在 http 块下的 upstream 块内部,不能塞进 server 或 location,否则启动报错:unknown directive "keepalive"。
-
keepalive 64表示:每个 worker 进程对这组 upstream 中的每台后端服务器,最多缓存 64 个空闲长连接 - 若你有
worker_processes 4,后端共 2 台(如192.168.1.10:8080和192.168.1.11:8080),理论最大空闲连接数是4 × 2 × 64 = 512 - 这个值不能拍脑袋定——建议按后端单实例稳定承载并发数的 60%~80% 设置。例如 Tomcat 的
maxConnections=200,可先试keepalive 128
location 中必须配齐两个 proxy 指令
只设 keepalive 不生效。Nginx 默认用 HTTP/1.0 转发请求,后端收到就断连,长连接形同虚设。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
proxy_http_version 1.1;:强制启用 HTTP/1.1 协议语义,这是持久连接的基础 -
proxy_set_header Connection "";:清空客户端可能传来的Connection: close等干扰头,避免被透传给后端 - 这两行必须写在使用
proxy_pass的location块中,且对所有目标 upstream 生效
配套控制单连接生命周期
从 Nginx 1.15.3+ 开始,keepalive_timeout 和 keepalive_requests 才真正作用于 upstream 连接池。老版本(如 1.12)只认 keepalive,不支持自动回收。
-
keepalive_timeout 20s;:空闲连接在池中最多保留 20 秒;必须比后端空闲超时(如 Tomcat 的connection-timeout)小至少 5 秒,否则 Nginx 想复用,后端已关 -
keepalive_requests 500;:单个连接最多转发 500 次请求后强制关闭;默认 100 太保守,高并发 API 场景推荐 500~1000,防状态累积或内存泄漏
后端服务必须配合才能真正复用
Nginx 想保持连接,后端得愿意一直挂着。否则 keepalive 就是空转。
- Spring Boot(Tomcat):确认
server.tomcat.connection-timeout≥ 45s,且未设置maxKeepAliveRequests=1 - Go:检查是否调用过
SetKeepAlivesEnabled(false);推荐MaxIdleConnsPerHost ≥ Nginx keepalive 值 - Node.js:避免响应后手动执行
req.socket.destroy();默认支持,但需清理这类逻辑 - 验证方法:用
ss -tnp | grep :8080 | grep ESTAB观察连接数是否稳定;抓包看后端响应头是否有Connection: keep-alive










