keepalive_timeout优化核心是平衡复用与释放:设太长致空闲连接堆积、耗尽资源,设太短则频繁建连增开销;需按业务场景分层设置(如静态资源10–30秒、移动端5–15秒),并协同upstream keepalive、proxy_http_version 1.1等配置防502。

keepalive_timeout 优化对并发性能的提升,核心不在“设大”,而在于让空闲连接既不早夭、也不赖着不走——它直接决定每条 TCP 连接能复用几次、占内存多久、会不会卡住新请求。
匹配业务节奏,避免连接“假长活”
浏览器加载一个网页,往往在几秒内发起 10+ 个并行请求(HTML、JS、CSS、图片),之后就进入空闲。若 keepalive_timeout 设为 65 秒,但用户 2 秒后就切走页面,那剩下 63 秒就是纯资源占用。
- 静态资源/CDN 服务:设 10–30 秒,快速释放,适配并行加载后即休眠的特点
- 移动端 API:设 5–15 秒,App 后台常被系统休眠,长连接极易变“僵尸”
- 内网管理后台或 SSE 推送:可设 60–120 秒,前提是客户端真有持续复用行为
- 高并发网关(如消息中台):建议 ≤ 5 秒,并开启 reset_timedout_connection on 主动清理异常连接
协同 upstream 长连接,堵住 502 漏洞
只调 client 端 keepalive_timeout,不配 upstream 的 keepalive,等于单边发力——后端一关连接,Nginx 复用时就会报 upstream prematurely closed connection 或 502。
- 确认后端支持长连接:Spring Boot 要设 server.tomcat.keep-alive-timeout=60;Node.js 要设 server.keepAliveTimeout = 60000
- Nginx upstream 块中启用连接池:keepalive 32;(值 ≈ 并发连接数的 1/4~1/2)
- location 中必须加:proxy_http_version 1.1; 和 proxy_set_header Connection '';
- Nginx 的 keepalive_timeout 建议比后端 keep-alive timeout 小 5 秒左右(如后端设 60s,Nginx 设 55s)
看指标,不看数值
调完配置不是终点,要验证是否真提升了复用率、降低了资源压力:
- 用 ss -tnpo | grep :443 | grep ESTAB | wc -l 对比调优前后 ESTABLISHED 连接数趋势
- 访问 /nginx_status,重点关注 Waiting 状态数——过高说明空闲连接积压,没被复用
- 开启日志变量 $connection_requests,统计单连接平均承载请求数;若长期 ≤ 2,说明复用失败
- 压测时观察 worker 进程 RSS 内存增长曲线,避免因连接堆积触发 OOM
配套必须同步调整的三项
单独改 keepalive_timeout 效果有限,以下三项必须一起检查:
- keepalive_requests:设为 50–100,防止单连接无限累积请求导致异常滞留
- client_header_timeout / client_body_timeout:建议统一设为 10–12 秒,避免慢攻击耗尽连接
- 系统级限制:确保 ulimit -n ≥ 65535,且 worker_connections × worker_processes ≤ ulimit -n



















