nginx upstream长连接空闲超时由keepalive_timeout参数控制,需在upstream块中配置且依赖keepalive、http/1.1及connection头清除等前提,推荐值20–45秒并须小于后端超时至少5–10秒。

在 Nginx 中配置 upstream 长连接的空闲超时释放阈值,核心是设置 upstream keepalive_timeout 参数。它专用于控制 Nginx 与后端服务之间那些「暂无请求转发」的空闲连接能保留多久,不是客户端超时,也不影响活跃连接。
必须满足的前提条件
该参数仅在以下全部条件成立时才生效:
- upstream 块中已启用 keepalive N(如
keepalive 32;),否则连接池不启用 - proxy 层明确开启 HTTP/1.1:
proxy_http_version 1.1; - proxy 层清除 Connection 头:
proxy_set_header Connection ''; - 后端响应头包含
Connection: keep-alive(HTTP/1.1 默认行为) - 后端自身空闲超时(如 Tomcat 的
connectionTimeout)严格大于该值
正确写法与位置
必须写在 upstream { } 块内,不能放在 http 或 location 中:
upstream backend {
server 10.0.1.10:8080;
keepalive 32;
keepalive_timeout 30s; # ← 关键:空闲连接最多保留 30 秒
}
同时,在对应的 location 块中补全协议支持:
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
# 其他 proxy_* 配置...
}
合理取值建议
推荐设为 20–45 秒,需遵循两个硬约束:
- 必须比后端空闲超时小至少 5–10 秒(例如后端设了 60 秒,Nginx 就设 30–45 秒)
- 避免低于 10 秒:连接刚建好就回收,复用率骤降,ESTABLISHED 连接数剧烈波动
- 避免高于 60 秒:空闲连接积压,易被后端单方面 RST,日志出现
upstream prematurely closed connection
配套参数要同步调优
单独设 keepalive_timeout 不起作用,还需协同以下两项:
- keepalive_requests:单个空闲连接最多处理多少次请求,生产环境建议 1000–5000(默认 100 太保守)
- keepalive:每个 worker 进程对每台后端缓存的空闲连接数,建议按后端单实例承载能力 × 0.6~0.8 ÷ worker 数反推(如后端撑 200 并发、4 个 worker → 设 32 或 48)











