keepalive_timeout 是 Nginx 控制 HTTP/1.1 空闲连接等待时长的关键参数,影响连接复用与内存占用平衡,需结合业务、客户端行为及系统资源设为 5~30 秒等合理值,并配合 keepalive_requests、upstream keepalive 等配置协同优化。

调整 keepalive_timeout 是 Nginx 优化高并发场景下连接复用与内存占用的关键手段。设得太长,空闲连接占着内存不放;设得太短,客户端频繁重连,增加 TCP 开销和服务器负载。合理值需结合业务特性、客户端行为和系统资源综合判断。
理解 keepalive_timeout 的实际作用
该指令控制 Nginx 在关闭 HTTP/1.1 持久连接前等待下一个请求的时长(单位:秒)。它只影响已建立但暂无数据传输的空闲连接,并不决定连接总生命周期或 TLS 握手行为。注意:
– 客户端(如浏览器)也有自己的 keep-alive 超时策略,Nginx 设置不能单方面强制延长;
– 对于反向代理场景,后端 upstream 的 keepalive 设置需独立配置,与 client 端 timeout 无关;
– 启用 keepalive_requests 可限制单连接最大请求数,配合 timeout 更精细地释放连接。
常见取值建议与适用场景
默认值通常为 65 秒,但多数现代 Web 应用无需这么久:
– 静态资源服务(CDN、图片站):10~30 秒较稳妥,兼顾移动端弱网重试与连接回收;
– API 接口(尤其移动端 App):5~15 秒更合适,App 常批量请求后进入休眠,长连接易成“僵尸”;
– 内网服务或长轮询(SSE、WebSocket 升级前):可设为 60~300 秒,但需确认客户端确实持续复用;
– 高并发低延迟场景(如实时消息推送网关):建议 ≤ 5 秒,并启用 reset_timedout_connection on 快速回收异常连接。
观察与验证调优效果
仅改配置不够,需通过指标验证是否真正改善:
– 使用 netstat -an | grep :80 | grep ESTABLISHED | wc -l 或 ss -s 查看活跃连接数变化;
– 监控 Nginx 的 Active connections 和 Reading/Writing/Waiting 状态,Waiting 过高常意味着大量空闲 keepalive 连接滞留;
– 结合日志分析,开启 $connection_requests 和 $request_time,识别单连接承载请求频次与间隔;
– 压测时对比不同 timeout 下的内存 RSS 增长曲线(ps aux --sort=-%mem | head -5),避免因连接堆积触发 OOM。
配套必须检查的配置项
单独调 keepalive_timeout 效果有限,以下设置需同步审视:
– 确保 keepalive_requests 不设为 0 或过大(推荐 100~1000),防止单连接无限累积请求;
– 反向代理中启用 upstream keepalive(如 keepalive 32;),并配合 proxy_http_version 1.1; 和 proxy_set_header Connection '';;
– 若使用 HTTP/2,keepalive_timeout 仍生效,但因多路复用特性,相同并发下连接数显著减少,可适当放宽;
– 在 http 或 server 块中统一设置,避免 location 级别覆盖导致行为不一致。











