nginx 限制恶意长连接需协同四类配置:一、缩短 keepalive_timeout 至10–25秒并设 keepalive_requests 为30;二、用 limit_req 配合 limit_conn 防止单连接高频请求;三、对静态资源禁用 keepalive;四、通过 geo 或 cookie 区分可信来源并差异化限流。

Nginx 限制恶意长连接请求,关键不是“一刀切断所有长连接”,而是控制其生命周期、复用行为和资源占用强度,防止攻击者用少量 TCP 连接持续发送高频请求(如 Keep-Alive 下反复刷 API),耗尽服务器连接池或后端处理能力。
以下四类配置协同生效,针对性强、落地简单:
一、缩短长连接存活时间
HTTP/1.1 默认 keepalive_timeout 是 75 秒,攻击者可长期复用一个连接发数百次请求。应主动收紧:
-
keepalive_timeout 15s;(建议 10–25 秒) -
keepalive_requests 30;(达到后强制断开,防单连接无限刷)注意:
keepalive_requests是指单个连接内允许处理的最大请求数,不是并发数。设为 30 可有效打断自动化脚本的“连接复用+循环请求”模式。
二、对长连接场景叠加请求速率限制
limit_conn 只管“连接数”,不管“连接里发多少请求”。必须配合 limit_req 防止单连接高频攻击:
limit_req_zone $binary_remote_addr zone=api_rate:10m rate=5r/s;
location /api/ {
limit_conn addr 5; # 每 IP 最多 5 个并发连接
limit_req zone=api_rate burst=10 nodelay; # 每秒最多 5 请求,突发容忍 10
}
✅
burst=10允许短时脉冲,避免误杀正常 AJAX 调用;nodelay防排队堆积,但需确保后端能扛住瞬时压力。
三、区分连接类型,关闭非必要长连接
静态资源(JS/CSS/图片)、公开接口(如 /status)无需长连接,直接禁用:
location ~ \.(js|css|png|jpg|gif)$ {
keepalive_disable all; # 关闭所有客户端的 keepalive
expires 1h;
add_header Cache-Control "public, immutable";
}
keepalive_disable all比keepalive_timeout 0更彻底,连接响应完立即断开,不等超时。
四、识别并放行可信长连接来源
企业内网、CDN 节点、登录态用户往往需要稳定长连接,硬限会误伤:
- 用
geo指令标记白名单 IP 段:geo $trusted_conn { default 0; 10.0.0.0/8 1; 172.16.0.0/12 1; 192.168.0.0/16 1; } - 在 location 中条件启用限制:
limit_conn addr 5 if=$trusted_conn; # 仅对非可信 IP 生效
或更精细地基于 Cookie(如已登录用户):
limit_conn_zone $cookie_session_id zone=login:10m;limit_conn login 20;—— 已登录用户放宽至 20 连接,未登录仍限 5。
不复杂但容易忽略











