记录一下那天晚上的排查过程。上线当晚上线了按 IP 的限流,触发了一次 429,之后十二小时里 Googlebot 的所有请求都返回 429。直接 curl 源站是 200,走域名就是 429,响应头里 age 显示 43000 多秒。改限流阈值、重启源站都没用。

刚开始盯着「缓存键里没有区分 UA,用户被限的结果也套到了爬虫身上」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。边缘默认会缓存部分非 200 响应,429 没有带 no-store 就被留在节点上。也可能是限流规则按回源 IP 计算,CDN 所有节点共用一个出口,等于把蜘蛛整体限住。

少数情况下是回源请求带了 cache-control: public,边缘按公开内容处理。

上来先看响应头里的年龄和缓存命中状态

curl -sI https://www.example.com/robots.txt | grep -i -E 'HTTP/|age|cf-cache'

接着绕过 CDN 直连源站确认限流本身是否已经解除

curl -sI --resolve www.example.com:443:203.0.113.10 https://www.example.com/ | head -3

给 4xx 和 5xx 明确加上不缓存,只缓存 200

add_header Cache-Control "no-store" always;

等前面都确认过,再按真实客户端 IP 而不是回源 IP 限流,并把蜘蛛网段排除

set_real_ip_from 198.51.100.0/24; real_ip_header CF-Connecting-IP;

怎么算真的好了,看的是同一批现象。清缓存后同一路径立即返回 200,age 归零,蜘蛛第二天的抓取量恢复到限流前的水平。

提醒一点。限流一旦把爬虫挡在门外,重试会越来越密集,反而更容易再次触发规则,先把缓存清干净再调阈值。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189