keepalive_requests 通过主动限制单连接请求数(如设为500–1000),在回源链路中强制连接定期退出复用池,协同upstream keepalive和proxy_socket_keepalive,规避后端更新、中间设备静默断连、TLS老化等导致的“看似正常实则失效”问题。

keepalive_requests 本身不直接“防止过早失效”,而是通过主动控制单连接寿命,避免因连接复用过久导致的隐性失效(如 TLS 会话过期、SSL 缓存陈旧、后端连接老化、中间设备静默回收等)。在网关回源场景中,它和 upstream keepalive、proxy_socket_keepalive 协同工作,才能真正提升回源链路稳定性。
它为什么能缓解回源连接“看似正常实则失效”的问题
网关(Nginx)与上游服务之间的长连接,若长期复用,容易积累状态问题:
- 后端微服务重启或滚动更新后,旧连接未及时断开,继续发请求可能返回 502/504;
- 中间 LB 或防火墙对空闲连接设了较短的超时(如 60s),但 Nginx 的
keepalive_timeout设为 120s,连接实际已被中间设备静默关闭; - SSL session 复用缓存老化,TLS 握手失败率上升,却表现为 HTTP 层超时;
- 连接长时间未释放,占用上游连接池槽位,加剧后端资源争抢。
keepalive_requests 通过“请求数归零重启”机制,让连接在处理完一定数量请求后主动退出复用池,天然规避上述老化风险——不是等它坏,而是让它在变坏前就换新。
关键配置组合(回源段必须生效)
只在 http 或 server 块设 keepalive_requests 没用,它只管客户端到 Nginx 这一段。回源链路的稳定性,取决于 upstream 配置:
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
# ✅ 启用 upstream 连接池(核心!)
keepalive 32; # 每个 worker 保留在池中的空闲连接数
# ✅ 强制使用 HTTP/1.1 并清除 Connection 头干扰
keepalive_requests 1000; # 每个 upstream 连接最多处理 1000 次请求
keepalive_timeout 60s; # 空闲 60 秒关闭(与 requests 形成双保险)
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection ''; # 清除 client 发来的 close 头
proxy_set_header Keep-Alive ''; # 避免透传干扰
}
}
⚠️ 注意:
keepalive_requests在upstream块中设置才作用于回源连接(Nginx → 后端),这是很多人的误区。
如何定值:按后端响应特征匹配
不要拍脑袋设 1000 或 5000,重点看你的上游服务行为:
-
高 QPS、低延迟 API(如用户鉴权、配置中心):设
keepalive_requests 500–1000,配合keepalive_timeout 30s,加快轮转,降低单连接故障影响面; -
响应较慢或偶发抖动的服务(如报表查询、文件上传):设
keepalive_requests 200–500,让连接更早释放重试,避免卡在一个慢连接上; -
强依赖 TLS 复用且证书稳定的服务(如内部 gRPC-Web):可适当提高至
1000–2000,但需确认上游支持 session resumption; -
已启用
proxy_socket_keepalive on的场景:可将keepalive_requests设得稍大(如 1500),因为 socket keepalive 能防中间设备断连,此时主要防的是应用层老化。
必须同步检查的配套项
否则 keepalive_requests 再合理也白搭:
- 确认上游服务监听端口支持 HTTP/1.1,并正确响应
Connection: keep-alive; - 检查是否有 CDN、WAF 或四层 LB 在链路中强制断连——它们可能无视
keepalive_timeout,但无法绕过keepalive_requests的主动关闭; - 若上游是 Kubernetes Service,注意
kube-proxy的连接空闲超时(默认 300s),应确保 Nginx 的keepalive_timeout小于该值; - 开启
reset_timedout_connection on;,对已超时但未完成的回源请求快速 RST,避免堆积在 TIME_WAIT。
不复杂但容易忽略的是:keepalive_requests 是“健康轮换”的开关,不是“延长寿命”的补丁。它让连接死得有规律,而不是死得莫名其妙。










