核心是防止连接被长期霸占或高频复用,需结合limit_conn、keepalive_timeout、limit_req及白名单策略协同防御。

处理恶意客户端占用连接资源,核心是防止连接被长期霸占或高频复用,而不是单纯“限制总数”。Nginx 提供的 limit_conn 是基础手段,但必须配合超时控制、请求频次压制和连接类型区分,才能真正阻断攻击链。
按 IP 限制并发连接数
这是第一道防线,直接卡住单个客户端能维持多少活跃连接:
- 在
http{}块中定义共享内存区:limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; - 在
server或location中启用限制:limit_conn conn_per_ip 3;(对登录页建议设为 2–3,静态资源可设为 5–8) - 搭配
limit_conn_status 429;可统一返回 429 状态码,便于前端识别
收紧长连接生命周期
攻击者常利用 HTTP/1.1 的 keep-alive 复用一个连接反复发请求。光限连接数不够,必须缩短其“可复用时间”:
- 降低全局或关键路径的
keepalive_timeout,例如:keepalive_timeout 15s;(不建议低于 10s,避免误伤移动端) - 限制单连接最大请求数:
keepalive_requests 30;(达到后强制断开,打断脚本循环刷接口) - 对 JS/CSS/图片等静态资源,直接禁用 keepalive:
location ~ \.(js|css|png|jpg|gif)$ { keepalive_disable all; }
叠加请求速率限制防止单连接高频攻击
limit_conn 只管“连接数量”,不管“每个连接里发多少请求”。恶意脚本可能只建 1 个连接,却每秒发 50 次请求 —— 这必须靠 limit_req 拦截:
- 定义请求速率区域:
limit_req_zone $binary_remote_addr zone=api_req:10m rate=5r/s; - 在 API 路径下同时启用连接与请求限制:
location /api/ { limit_conn conn_per_ip 2; limit_req zone=api_req burst=8 nodelay; } -
burst=8允许短时波动(如正常 AJAX 批量调用),nodelay防止排队堆积导致响应延迟
识别可信来源并差异化策略
企业内网、CDN 节点、已登录用户需要稳定连接,硬限会误伤。可用 geo 或 map 区分处理:
- 标记白名单 IP 段:
geo $trusted { default 0; 192.168.0.0/16 1; 10.0.0.0/8 1; } - 对可信来源跳过连接限制:
limit_conn conn_per_ip $trusted;(当 $trusted 为 0 时才生效) - 或结合 cookie 判断登录态:
map $cookie_sessionid $is_logged_in { "" 0; default 1; },再用于条件限流


















