要让nginx与上游后端真正保持长连接,需协议(proxy_http_version 1.1)、头部(proxy_set_header connection "")和连接池(upstream keepalive n)三者严格对齐,缺一不可;同时合理设置keepalive_requests和keepalive_timeout,并实测验证。

要让 Nginx 与上游后端服务器真正保持常驻长连接,关键不是只写一行 keepalive 32,而是让协议、头部、连接池三者严格对齐。缺任何一环,连接池都形同虚设,Nginx 仍会不断新建 TCP 连接。
upstream 块中必须正确声明 keepalive
该指令只能出现在 upstream 块内,且必须在 http 块下定义,不能嵌套在 server 或 location 中。否则 Nginx 启动会报错: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 API)可从 32~64 起步
配套 proxy 设置缺一不可
仅配置 keepalive 不生效——Nginx 默认用 HTTP/1.0 向后端发请求,而 HTTP/1.0 不支持复用连接。
- 在
location块中添加proxy_http_version 1.1;,强制启用 HTTP/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 次请求后主动关闭,防后端状态泄漏或内存堆积;默认 100 太保守,API 场景推荐 500~1000 -
keepalive_timeout 20s;:空闲连接在池中最多保留 20 秒;建议比后端服务的空闲超时(如 Tomcat 的connectionTimeout)小 5~10 秒,避免 Nginx 持有已失效连接
验证是否真正生效
配置写完不等于跑通,需实测确认:
- 执行
ss -tnp | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期值附近,而非剧烈波动或持续增长 - 压测时对比开启前后:后端
TIME_WAIT数量、P95 延迟、建连耗时 - 检查后端响应头是否含
Connection: keep-alive;若返回close或缺失,说明后端未配合或中间设备干扰











