为了压掉 SEO 工具抓取,在 Nginx 里按 UA 给 AhrefsBot 设了每秒一次的限流,结果同机房的 Bingbot 也被限到 429,Bing 抓取量一周掉了四成。
一开始怀疑是「429 响应没有 Retry-After,蜘蛛直接降低抓取频率」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。限流的键用了 IP 段而不是 UA,同段爬虫一起被限。还有一种是burst 设得太小,正常突发也触发限流。
还有一种情况,规则写在 server 级,静态资源请求也计入。
先确认 429 的 UA 分布
awk '$9==429 {print $12}' access.log | sort | uniq -c | sort -rn | head
随后把限流键改成 UA 精确匹配
map $http_user_agent $limit_key { default ""; ~*AhrefsBot $http_user_agent; }
给 429 加 Retry-After
add_header Retry-After 120 always;
复查 Bingbot 的状态码
grep 'bingbot' access.log | awk '{print $9}' | sort | uniq -c
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
改完先别撤,确认这几项。Bingbot 不再出现 429,AhrefsBot 仍被限流,Bing 抓取量两周后回到限流前的水平。
补一句。按 UA 做限流键比按 IP 精确,但 UA 可伪造,真要挡工具站还得配合 IP 段和行为特征。这类问题最好一次改到位,反复小改反而容易把原因搅混。
