直接限制特定ip对动态内容的高频请求是最有效的防暴力爬取方式之一,需通过ip+路径双维度限速、区分敏感接口策略、结合日志与动态封禁,并避开静态资源限速等常见陷阱。

直接限制特定 IP 对动态内容的高频请求,是防暴力爬取最有效的方式之一。重点不是封死所有访问,而是让恶意行为成本变高、节奏被打断,同时不干扰真实用户。
按 IP + 路径双维度限速
只靠 IP 限速容易误伤,只靠路径限速又挡不住换 IP 的扫描。两者叠加才能精准压制:
- 在 http 块定义两个限速区域:一个按 IP,一个按 URI
- 在 location 中同时启用两者,任一超限即拒绝
- 例如对
/api/v1/或/search这类返回 JSON 的动态接口:
limit_req_zone $binary_remote_addr zone=per_ip:10m rate=8r/s;
limit_req_zone $uri zone=per_api:10m rate=3r/s;
location ^~ /api/v1/ {
limit_req zone=per_ip burst=15 nodelay;
limit_req zone=per_api burst=5 nodelay;
proxy_pass http://backend;
}
这样既控单 IP 总频次(防扫多个接口),也控单路径频次(防猛刷某一个搜索入口)。
区分对待登录与后台类敏感接口
这类接口是暴力爬取的重灾区,需更严格策略:
- 对
/login、/admin/login、/wp-login.php单独设限,rate 可压到2r/m(每分钟 2 次) - burst 设小(如 2~3),避免试探窗口
- 配合
nodelay,超限立刻返回 503 或 429,不给攻击者反馈延迟 - 若用 CDN,必须先配置
real_ip_header X-Forwarded-For和set_real_ip_from,否则限速对象会错成 CDN 节点 IP
结合日志识别并临时封禁异常行为
光靠静态限速不够,要让防护“活起来”:
- 在 access_log 中加入
$limit变量,快速定位被限请求来源 - 监控 5 分钟内对同一动态路径触发 ≥20 次 404 或 200 的 IP(可能是路径爆破或参数探测)
- 用 Fail2ban 解析 Nginx 日志,自动将可疑 IP 加入系统级防火墙(iptables/nftables)
- 也可用 Lua + Redis 实现毫秒级动态黑名单,适合高并发场景
避开常见陷阱
这些细节决定配置是否真正生效:
- 不要对
/static/、/assets/等路径启用路径级限速,否则影响页面加载和浏览器预加载 -
limit_conn限制的是并发连接数,不是请求数;对 API 类动态内容,优先用limit_req - 避免仅靠 User-Agent 或空 Referer 封禁,高级爬虫极易绕过;它只能作为辅助手段
- 上线后先用宽松值(如
10r/s)观察一周,再逐步收紧,防止误伤合法自动化工具(如监控探针)











