报错是这么冒出来的。升级 HTTP/2 后按 IP 统计蜘蛛并发,单个 IP 同时挂着一百多个请求,限流规则误判成攻击把 Googlebot 挡了,抓取量当天掉了一半。
排查方向其实有限,先把可能性排一排。HTTP/2 一条连接承载多路请求,日志里连接数为 1 但请求数很多。另一种情况是按连接数限流的规则对 h2 失效,按请求数限流又过于激进。
少数情况下是h2 下 UA 头在 HPACK 里压缩,部分日志字段取不到值。
上来先对比 h1 与 h2 的请求分布
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5
限流改用请求速率而不是连接数
limit_req_zone $binary_remote_addr zone=bot2:10m rate=30r/s;
等前面都确认过,再确认日志里 UA 字段能被正确记录
tail -20 access.log | awk -F'"' '{print $6}' | sort | uniq -c
恢复的判定其实很直接。蜘蛛 IP 的请求速率被限制在每秒 30 次以内且没有出现 503,抓取量第二天回到此前日均水平,日志里 UA 字段不再为空。
h2 下的限流要按请求算,按连接算等于没有限制,这一点在换协议时最容易被忽略。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
