核心是三参数协同:upstream keepalive(按后端能力×0.6–0.8反推,如200连接/4 worker→设120–160)、keepalive_requests(生产推荐1000–5000,防频繁断连)、keepalive_timeout(必须≤后端timeout−10s,如后端60s则设50s),并强制配proxy_http_version 1.1和proxy_set_header Connection ''。

要避免 Keepalive 超时引发后端连接枯竭,核心不是“延长超时”,而是让 Nginx 与 upstream 的连接池健康复用、及时释放、不堆积失效连接。关键在于三组参数协同:连接池容量(upstream keepalive)、单连接寿命(keepalive_requests)、空闲存活窗口(keepalive_timeout),且必须配合协议头控制。
upstream 连接池大小必须匹配后端承载能力
每个 worker 进程维护的空闲连接数不能超过后端单实例可稳定处理的并发连接上限,否则连接会被后端主动拒绝或 RST:
- 设后端服务(如 Spring Boot/Tomcat)最大连接数为 200,Nginx 有 4 个 worker,则建议 upstream keepalive 120~160(按 0.6–0.8 系数)
- 值过大 → 后端连接队列满,新请求排队或被拒;值过小 → 连接频繁重建,CPU 和 TIME_WAIT 暴涨
- 切勿直接写
keepalive 1024这类固定大值,需结合压测验证
单连接请求数(keepalive_requests)要设得够高但不过载
默认 100 极易导致连接刚复用几次就被强制关闭,造成“假长连接”:
- 生产环境推荐设为 1000~5000,高频轻量接口可到 10000
- 设太低:连接反复建/断,上游连接数虚高,后端看到大量短连接
- 设太高:若后端因空闲超时(如 Tomcat 的
connectionTimeout=20000)提前断连,Nginx 不感知,该连接在池中变为“僵尸”,后续请求失败
空闲超时(keepalive_timeout)必须小于后端设置
Nginx 不主动保活,只缓存空闲连接;若自身超时大于后端,就会保留已失效连接:
- 查后端 keepalive timeout(如 Node.js 的
server.keepAliveTimeout、Tomcat 的connectionTimeout),确保 Nginx 的 keepalive_timeout ≤ 后端值 − 10s - 例如后端设 60s,则 Nginx 设
keepalive_timeout 50s - 设为 0 或过大(如 120s)→ 失效连接滞留池中,可用连接数持续下降,最终触发“连接枯竭”
协议头配置缺一不可
即使 upstream 块写了 keepalive,没这两行,Nginx 仍走 HTTP/1.0 短连接:
- 在
location块中必须包含:proxy_http_version 1.1;proxy_set_header Connection ""; - 注意:
Connection ""是清空 header,不是设为"keep-alive";设错会导致后端误判并立即关闭连接 - 检查后端响应头是否含
Connection: keep-alive,若返回close,说明后端未启用或中间有代理干扰


















