location = /list/ {
    limit_req zone=crawl burst=20 nodelay;
    add_header Retry-After 120 always;
}

access.log 里同一个 UA 一秒打了 40 次列表页,源站返回 429,第二天抓取量从 1.2 万降到 800,第三天直接归零。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:列表页带了实时统计接口,每次请求都查库,限流规则按 IP 触发,抓取工具被当成攻击源。429 没有带 Retry-After,抓取端按最长退避处理。

「抓取频率过高 429」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:先给列表页加 60 秒页面缓存,把回源压下去;对已知抓取 UA 单独放行,别和普通 IP 共用阈值;429 响应补上 Retry-After,值写 120 秒。

确认没问题再收工,抓取工具请求返回 200,三天后抓取量回到 1 万以上。

作者 9823189