keepalive_requests是Nginx控制upstream长连接复用次数的阈值,达限即关闭连接以释放内存;仅作用于proxy_pass后端连接,建议设20–50起步压测,需协同keepalive_timeout、buffer及SSL会话优化。

通过 keepalive_requests 限制单条长连接的请求复用次数,是 Nginx 控制连接生命周期、防止 Worker 进程内存持续增长的有效手段。它不直接限制连接时长或空闲时间,而是从“事件复用次数”维度切入——每次请求处理完,若连接保持活跃并被复用,计数器加 1;达到阈值后,Nginx 主动关闭该连接,释放关联的内存上下文(如 request 结构体、buffer 链、SSL session 缓存等),避免因长连接长期驻留、反复挂载新请求导致内存无法及时回收。
keepalive_requests 的作用机制
该指令仅对启用 keepalive 的 upstream 连接生效(常用于反向代理场景),配合 keepalive 指令使用。Nginx 为每个保活连接维护一个独立计数器,每次从该连接上成功读取并处理完一个完整请求(HTTP/1.1 或 HTTP/2 stream),计数器递增。达到设定值后,连接在响应发送完毕后立即关闭,不等待 keepalive_timeout 到期。
- 不是按时间清理,而是按“有效请求次数”清理,更契合业务负载特征
- 只影响复用中的连接,新建连接重置计数器
- 对客户端直连(server 块中的 keepalive)不生效,仅作用于 proxy_pass 后端连接
典型配置与参数调优建议
在 upstream 块中设置,需结合业务平均请求体积、Worker 内存水位和后端稳定性综合判断:
- 默认值为 100,对高吞吐小包接口(如 API 网关)可能偏高,易积累大量中等生命周期连接
- 建议从 20–50 起步压测:例如
upstream backend { keepalive 32; keepalive_requests 30; } - 若后端偶发卡顿,可适当降低(如 10–20),加快异常连接退出,减少内存滞留
- 避免设为 1:失去连接复用意义,退化为短连接,增加 TCP 开销
如何验证是否生效
通过 Nginx stub_status 模块或开源监控工具(如 nginx-module-vts)观察关键指标变化:
-
Active connections中的 keepalive 连接数应呈现周期性回落,而非持续缓升 - 对比开启前后,Worker 进程 RSS 内存曲线是否由“缓慢爬升+平台期”变为“锯齿状小幅波动”
- 日志中可添加
$connection_requests变量,统计单连接处理请求数分布,确认是否集中在设定阈值附近截断
搭配使用的必要措施
单独依赖 keepalive_requests 不足以彻底解决内存滑坡,需协同优化:
- 必须设置合理的
keepalive_timeout(如 60s),兜底超时关闭,防异常连接永久驻留 - 启用
proxy_buffering off或调小proxy_buffers,避免大响应体长期占用 buffer 内存 - 对 SSL 连接,配置
ssl_session_cache shared:SSL:10m并限制ssl_session_timeout,防止 SSL session 对象堆积 - 定期 reload Nginx(如每日低峰期),强制回收难以追踪的残留内存










