keepalive_timeout和keepalive_requests共同控制客户端到Nginx长连接生命周期,前者设空闲超时(如65 60),后者限单连接请求数(默认100),任一条件满足即断连。

直接在 http、server 或 location 块中配置 keepalive_timeout 和 keepalive_requests 两个指令即可。它们共同决定客户端到 Nginx 这一段长连接的生命周期,谁先触发就先断连。
keepalive_timeout:控制空闲等待时长
该指令设置连接空闲多久后关闭,单位为秒,可带一个或两个参数:
- 第一个值:Nginx 主动关闭空闲连接的超时时间(必填)
- 第二个值(可选):写入响应头
Keep-Alive: timeout=xxx的建议值,仅影响部分客户端行为
常见用法示例:
-
keepalive_timeout 30s;—— 空闲 30 秒即断,响应头也写 30 -
keepalive_timeout 65 60;—— 服务端等 65 秒,告诉客户端“建议你 60 秒内发下个请求”
不同场景推荐值:
- 静态资源/CDN 边缘节点:10–30 秒(快速释放)
- 移动端 API 或后台管理页:5–20 秒(适配 App 休眠)
- 常规 Web 站点:30–65 秒(兼容主流浏览器默认策略)
- 内网长轮询(SSE)或稳定服务:60–300 秒(延长复用周期)
keepalive_requests:限制单连接处理请求数
它不看时间,只计数——一条连接从建立起,最多服务多少次 HTTP 请求后必须关闭。默认是 100,现代业务通常偏小。
按典型用户会话设起点值:
- React/Vue 单页应用(含首屏资源 + 路由切换 + 轮询):2000
- 高频轻量 API(如每 2–5 秒心跳):1000–3000
- 低频后台页面或操作稀疏接口:200–500
- 后端偶发卡顿或需快速隔离异常:100–300
注意:这个值只对 HTTP/1.1 keep-alive 生效;HTTP/2 用 http_v2_max_requests 控制。
必须同步调整的配套项
单独改这两个参数效果有限,以下几项要一并检查:
-
keepalive_timeout应略大于请求平均间隔(例如平均 1 秒一次请求,timeout 可设 15–30 秒),避免过早断连 - 反向代理场景下,
upstream块必须启用keepalive N,并确保proxy_http_version 1.1和proxy_set_header Connection ""已配置,否则前端优化白费 - 禁用老旧兼容指令如
keepalive_disable msie6,现代 SDK 或 App 客户端可能被误判 - 开启
reset_timedout_connection on,可主动清理僵死连接,防止长期占内存和文件描述符
怎么验证是否调得合理
不能只看配置写了没,要观察真实行为:
- 用
ss -tnp | grep :443 | grep ESTAB | wc -l查活跃连接数:调优后应更平稳,不再持续缓慢上升 - 查 Nginx 日志中
$connection_requests字段分布:多数连接应在设定区间内关闭(如设 2000,则大部分连接在 1500–2000 次请求后断开) - 压测时对比
TIME_WAIT数量:合理调优后,相同 QPS 下应明显下降 - 用
curl -I连续请求,观察响应头:前几次返回Connection: keep-alive,接近上限时变为Connection: close











