真正起效的是超时参数组合调优而非limit_conn:1. keepalive_timeout+reset_timedout_connection主动终结空闲连接;2. upstream超时防后端拖垮;3. limit_conn仅限新建连接;4. 内核参数加速状态回收。

limit_conn 本身不清理僵尸连接,它只限制新连接建立;真正负责快速释放僵死连接的是超时参数组合 + reset_timedout_connection。Nginx 没有“僵尸连接”的标准定义,实际运维中所谓僵尸,多指已断开但未及时关闭的空闲连接(如长时间卡在 CLOSE_WAIT、FIN_WAIT2 或空闲 keepalive 状态),它们持续占用 fd 和内存。要实现“快速清理”,关键不是靠 limit_conn,而是用好以下四类参数协同控制生命周期。
1. 用 keepalive_timeout + reset_timedout_connection 主动终结空闲长连接
这是最直接有效的手段:
-
keepalive_timeout 15s;:把默认 75 秒大幅缩短至 15–30 秒,让空闲连接更快退出可复用队列 -
reset_timedout_connection on;:必须开启。超时后不再发 FIN,而是直接发 RST 包中断连接,强制内核立即释放 socket,避免 linger 在 TIME_WAIT 或 FIN_WAIT2 - 两者配合,能显著减少因攻击或客户端异常导致的堆积连接,尤其在高并发场景下效果明显
2. 配合 upstream 超时参数,防止后端拖垮连接状态
很多“僵尸”其实是卡在与后端交互环节:
-
proxy_read_timeout 30s;:后端响应慢或不响应时,Nginx 主动断开,避免连接长期滞留 CLOSE_WAIT -
proxy_connect_timeout 5s;:快速失败不可达后端,不浪费连接槽位 - 若使用 stream 模块代理 TCP/UDP,对应使用
proxy_timeout 30s;
3. limit_conn 的合理定位:防新建,不治已存
它只对“已完成请求头解析”的连接计数,无法识别半开或僵死连接:
-
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;:用二进制 IP 减少内存开销 -
limit_conn conn_per_ip 50;:限制单 IP 并发连接上限,防暴力建连耗尽资源 - 注意:该限制不触发清理动作,仅拒绝新连接请求(返回 503)
4. 内核级加速:辅助连接状态快速回收
Nginx 不管理 TCP 状态机,但可借力内核提升清理效率:
-
net.ipv4.tcp_tw_reuse = 1:允许 TIME_WAIT socket 复用于新 outbound 连接(反向代理场景极有用) -
net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT2 超时,加快被动关闭连接释放 - 需在系统层面配置,并配合
nginx -s reload生效
不复杂但容易忽略。真正起效的是超时参数的组合调优,而不是单纯加大 limit_conn 限制或删减 zone。


















