报错是这么冒出来的。日志按 IP 聚合后发现某个地址一天请求 8 万次,UA 写着 Chrome,rDNS 反查却是一段家宽动态地址,请求路径全集中在列表页。

中间走过弯路,把「抓取节奏机械,每隔固定 0.2 秒请求一次,没有页面内的资源请求」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。采集脚本跑在本机,出口 IP 就是家宽地址,UA 还是浏览器默认值。也可能是请求没有带 Accept 和 Referer,头部组合和真实浏览器差很多。

少数情况下是同一会话反复翻页到第 200 页,正常用户很少这样操作。

第一件事是按 IP 聚合请求量并排序

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

然后查看可疑 IP 的头部与路径特征

grep '203.0.113.45' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head

接着对高频 IP 返回 429 并保留观察

limit_req_status 429; limit_conn_status 429;

等前面都确认过,再加一条针对无 Referer 高频翻页的规则

if ($http_referer = '') { set $botflag 1; }

别只看报错消失,验证要多做一步。加上无 Referer 高频翻页的拦截后,该 IP 的请求量一天内降到 300 次以内,列表页的带宽占用同步回落。

这类采集往往换 IP 继续,单靠封 IP 只能止血,把列表分页做深度上限和登录校验才能真正压住。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189