keepalive_timeout并非越大越好,而是需根据客户端行为、业务场景和资源压力合理设置:浏览器端推荐60–65秒,静态资源可设75秒,移动端或高并发场景宜降至5–15秒;必须配套keepalive_requests限制单连接请求数,并协同upstream keepalive确保后端连接复用,否则易引发连接堆积或502错误。

keepalive_timeout 不是“越大越好”,也不是固定填个数字就能生效。它本质是控制 Nginx 与客户端之间空闲连接的生命周期,调对了能显著降低 TCP 握手开销、提升并发承载力;调错了可能引发连接堆积、文件描述符耗尽,甚至浏览器复用失败。
客户端侧 keepalive_timeout 怎么设才合理
这个值决定浏览器复用连接的窗口期,需兼顾协议兼容性、用户行为和资源压力:
- 主流现代浏览器默认支持 60–75 秒,旧版 IE 最多认 60 秒,所以生产环境推荐设为 60s 或 65s(如
keepalive_timeout 65s 60s;),第一个值是 Nginx 实际关闭空闲连接的时间,第二个值写入响应头Keep-Alive: timeout=60告知客户端 - 静态资源站(如 CDN、图片服务)可设稍高(75s),因页面加载密集,连接很快被复用
- 移动端 API 或长休眠场景建议调低(5–15s),避免 App 后台空连占用资源
- 高并发网关或资源受限环境可压到 ≤5s,防止 ESTABLISHED 连接数暴涨拖垮系统
别忘了配套设置 keepalive_requests
单连接请求数限制同样关键,否则一个连接持续复用可能引发内存累积或状态异常:
- 默认值 100 是较保守的选择,适合大多数 Web 站点
- 若后端有状态缓存(如 session 绑定)、或请求体较大,建议保持默认或略降(如 50)
- 纯无状态 API 网关且压测验证稳定,可提高至 1000~5000,但需同步监控连接错误率
- 注意:该值到达后 Nginx 主动断连,不等待超时,是主动“轮换”机制
反向代理场景必须协同 upstream keepalive
只调客户端侧没用——Nginx 到后端的连接也得复用,否则仍频繁握手:
- upstream 块中启用连接池:
keepalive 16;(常见值 16–32,按后端并发量的 1/4~1/2 预估) - location 中强制 HTTP/1.1 并清理 Connection 头:
proxy_http_version 1.1;+proxy_set_header Connection ''; - Nginx 的
keepalive_timeout应略小于后端服务的 keep-alive 超时(如 Spring Boot 设keep-alive-timeout=60,Nginx 就设 55s),避免 Nginx 先断导致 502 - 用
curl -v检查后端响应头含Connection: keep-alive,再用ss -tnpo | grep :端口观察 ESTABLISHED 连接是否稳定在 keepalive 设置值附近
怎么验证调优是否生效
数值调了不算数,要看真实连接复用效果:
- 打开
nginx_stub_status,关注Waiting数是否明显下降,Active connections中Reading/Writing占比是否上升 - 对比
ss -tnpo | grep :80 | wc -l和upstream keepalive值:若前者远大于后者,说明连接未被有效复用或上游提前断连 - 检查 error log 是否出现
upstream prematurely closed connection或upstream sent too big,这是上下游超时不匹配的典型信号 - 用 ab 或 wrk 做短连接 vs 长连接压测,观察 QPS 和平均延迟变化,确认握手损耗是否降低



















