⭐ 推荐:社区规则条款 V1.0

如何用 Nginx 限速阻止高频采集爬虫?

萝卜特棒
萝卜特棒 正式会员萌新站长
发布于 2026-10-15 05:14 ·0 浏览 ·2 回复
内容摘要

用 Nginx 阻止高频采集爬虫需同时配置 limit_req_zone 限制每 IP 请求频率、limit_conn_zone 限制并发连接、limit_rate 限制单连接带宽,超限返回 429,并合理设置 burst 与 nodela

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2070.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 2

满月居于空
满月居于空 版主萌新站长 1楼 2026-10-15 05:29

nodelay 表示突发部分立即放行而不是排队,burst 就是令牌桶的容量——rate 是令牌补充速度,burst 是桶能装多少,两个一起看才有意义。

日常采集防护的推荐配法:burst 取 rate × 2~3 秒的量,再加 nodelay。比如 rate=10r/s 配 burst=20 nodelay,含义是正常放行 10 请求/秒,瞬时最多多放 20 个,第 21 个之后的突发才返回 429。加 nodelay 是为了让突发请求立刻走完,而不是排队等令牌——排队会把响应时间拖到几秒,正常用户翻页会明显卡顿。

如果你确实想要"削峰整形"(宁可让请求排队也尽量别丢),Nginx 1.15.7+ 可以用 limit_req zone=req_perip burst=50 delay=20,前 20 个突发立即放行、后面的才进队列,比纯 nodelay 更平滑。

三个容易翻车的点:

  1. 前面挂了 CDN 或云 WAF 的话,$binary_remote_addr 拿到的是回源节点 IP,一个节点就能把你的 zone 打满,结果整站 429。必须配 set_real_ip_from + real_ip_header X-Forwarded-For 取回真实 IP,这是最常见的事故来源。
  2. 记得用 map 把百度、Bing 和自家监控 IP 白名单放行,或者单开一个宽松的 limit_req zone,否则被 429 误伤的就是你。
  3. limit_req 写在 if 块里不报错但不生效,只能放在 server 或 location 层级。

另外 429 别用默认空页,配个 error_page 429 指向静态页,免得爬虫和用户都以为是服务器挂了。

lqyyzz
lqyyzz 观望站长 #1765 2楼 2026-10-15 05:50
满月居于空:`nodelay` 表示突发部分立即放行而不是排队,`burst` 就是令牌桶的容量——`rate` 是令牌补充速度,`burst` 是桶能装多少,两个一起看才…

补得很全,burst 当令牌桶容量、delay 做削峰那两段我没什么可加的了,就补三个实操细节。

一、白名单用 map 生成 key,而不是在 limit_req 外面套 if。 让白名单 IP 的 key 为空字符串,Nginx 就会跳过计数,这是官方支持的用法:

map $remote_addr $limit_key {
    default        $binary_remote_addr;
    ~^127\.        "";      # 本机
    ~^10\.         "";      # 内网
    ~^66\.249\.    "";      # Googlebot 段,按需补
}
limit_req_zone $limit_key zone=req_perip:10m rate=10r/s;

比单开一个宽松 zone 更省状态内存,也不会出现「白名单 zone 被爬虫打满反过来误伤」的问题。

二、观测比调参重要。 limit_req 和 limit_conn 都自带状态变量,塞进 log_format 就能看清到底限了谁、限了多少:加 $limit_req_status $limit_conn_status,取值是 PASSED / DELAYED / REJECTED。按这个统计去调 burst,比拍脑袋试靠谱得多。

三、limit_conn 统计的是「正在被处理的请求数」,不是一个 TCP 连接。 keepalive 挂着的空闲连接不占额度,所以它和 limit_req 是互补而非重复,这点容易理解偏。另外 delay 的值必须小于等于 burst,写大了 nginx -t 直接报错,别等 reload 才发现。

一个坑:reload 之后 zone 是重新建的,计数清零,爬虫正好能趁这个空窗冲一波,所以调完参数别立刻下结论,看一两分钟日志再定。