nginx防高并发恶意流量需分层拦截、精准识别、动态响应,核心是原生模块组合:按ip限速(limit_req)、限连(limit_conn)、黑白名单(geo+map)、路径分级防护及自定义503提示页。

Nginx 防高并发恶意流量,核心不是“一刀切拦所有快请求”,而是分层拦截、精准识别、动态响应。重点在于用好原生模块组合,不依赖外部组件也能扛住大多数攻击。
按 IP 限速率,防爬虫和暴力刷接口
这是最常用也最有效的第一道防线。用 limit_req 基于漏桶算法控制单位时间请求数:
-
limit_req_zone $binary_remote_addr zone=attack_prevent:10m rate=5r/m;
表示每 IP 每分钟最多 5 次请求(适合登录、短信发送等敏感接口) - 在 location 中启用:
limit_req zone=attack_prevent burst=3 nodelay;
允许短时多 3 次,超了立刻拒绝(返回 503),不排队
注意:$binary_remote_addr 比 $remote_addr 更省内存;rate 单位可选 r/s 或 r/m,低频操作用 /m 更合理。
限制单 IP 并发连接数,防 Slowloris 类慢速攻击
恶意用户可能建大量长连接却不发完请求,耗尽服务器连接资源:
-
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; -
limit_conn conn_per_ip 3;
同一 IP 最多保持 3 个活跃连接,超出直接断连
搭配关键超时设置更稳妥:
-
client_header_timeout 15s; -
client_body_timeout 15s; -
keepalive_timeout 30s;
结合黑白名单,快速封禁已知恶意源
静态黑名单可直接在 http 块中配置:
geo $bad_ip {
default 0;
192.168.10.5 1; # 单个 IP
203.0.113.0/24 1; # 整个网段
}
map $bad_ip $limit_key {
1 "";
0 $binary_remote_addr;
}
limit_req_zone $limit_key zone=guarded:10m rate=10r/s;
这样,黑名单 IP 的请求直接跳过限流逻辑($limit_key 为空字符串),被 limit_req 视为同一“客户端”,瞬间触发限流阈值而被拒。
针对特定路径强化防护,比如 /login、/api/v1/sms
不要全站统一限速,而是按业务风险分级:
- 登录接口:
rate=3r/m burst=2(防爆破) - 短信接口:
rate=1r/m burst=1(加验证码后才放行) - 静态资源或首页:可放宽至
rate=100r/s,甚至不限
同时配合 limit_conn 控制每个 IP 在该路径下的连接数,避免用多线程工具反复建连。
返回友好提示,别只甩 503
默认 503 对用户不友好,建议自定义错误页:
error_page 503 /deny.html;
location = /deny.html {
internal;
root /usr/share/nginx/html;
}
页面内容可写“请求过于频繁,请稍后再试”,既降低投诉率,也减少真实用户误操作带来的误判。
不复杂但容易忽略











