Nginx通过keepalive_timeout主动关闭空闲连接以释放资源,推荐值为5–60s;keepalive_requests限制单连接请求数,默认100;reset_timedout_connection可加速异常连接清理;需协同client_header/body_timeout及proxy_read/send_timeout避免超时冲突。

在 Nginx 中,keepalive 本身不是“回收”连接的机制,而是通过 keepalive_timeout 主动关闭空闲连接,从而释放 socket、文件描述符等资源。所谓“自动回收无用连接”,本质是让 Nginx 在连接真正空闲(无请求/响应交互)达到设定时长后,及时发送 FIN 断开,避免堆积。
设置 keepalive_timeout 控制空闲断连时机
这是最核心的配置,直接决定连接空闲多久被关闭:
- 语法为
keepalive_timeout timeout [header_timeout];,单位秒(可写s) - 第一个值(如
30s)是 Nginx 实际执行关闭的阈值,必须设合理值,不能为 0(除非明确禁用长连接) - 第二个值(如
25s)仅用于响应头Keep-Alive: timeout=25,现代浏览器基本忽略,可省略或与第一个值一致 - 推荐值按场景区分:静态资源/高并发网关设 5–15s;常规 Web 站点设 30–60s;内网长轮询或 SSE 可设至 120s+
搭配 keepalive_requests 防止单连接长期占用
仅靠时间控制不够——如果客户端持续发请求(哪怕间隔很短),连接就永远不会空闲超时。这时需限制单连接处理请求数:
- 添加
keepalive_requests 100;(默认值),表示该连接最多服务 100 次请求后强制关闭 - 对上传接口、流式响应等易出现“慢请求”的路径,可单独设更小值,例如
location /upload/ { keepalive_requests 20; } - 这个参数和
keepalive_timeout是互补关系:一个管“空闲多久”,一个管“最多干几件事”
启用 reset_timedout_connection 加速异常连接清理
当客户端崩溃、网络中断却未发 FIN 时,连接可能卡在 FIN_WAIT2 或 TIME_WAIT 状态,Nginx 无法感知其已失效。此时需主动干预:
- 在
http或server块中添加reset_timedout_connection on; - 它会让 Nginx 对已超时且无活动的连接,直接发送 RST 包重置,跳过等待内核超时,更快释放资源
- 特别适用于移动端弱网、IoT 设备频繁掉线等场景
注意协同其他超时参数避免冲突
keepalive_timeout 不是孤立参数,若与其他超时不匹配,反而引发 502/504 或连接提前中断:
- 它应大于
client_header_timeout和client_body_timeout(否则大文件上传中途就被断) - 若用反向代理,
proxy_read_timeout和proxy_send_timeout应 ≥keepalive_timeout,尤其后端响应慢时 - 修改后务必执行
nginx -t && nginx -s reload生效,并用ss -tn state established | grep :80观察连接数是否随时间下降来验证效果



















