记录一下那天晚上的排查过程。站点监控面板的可用率一直是 99.9%,可 GSC 里抓取超时一路涨,翻日志才发现蜘蛛请求里有大量 499,被监控当成客户端主动断开排除了。
刚开始盯着「慢查询集中在几个列表页,白天被缓存挡住看不出来」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。499 是 Nginx 记录客户端提前关闭连接,监控默认不算故障。还有一种是蜘蛛等不及断开,是因为上游响应超过了它的超时阈值。
另外,报警规则只统计 500 到 599,499 完全落在盲区。
第一件事是统计蜘蛛请求里的 499 数量
awk '$0~/Googlebot/ && $9==499{c++} END{print c}' access.log
然后找出 499 最集中的地址
awk '$9==499{print $7}' access.log | sort | uniq -c | sort -rn | head
给这几个地址加缓存减少回源
proxy_cache_valid 200 10m;
proxy_cache_use_stale timeout;
剩下的就是把 499 纳入监控告警
expr: rate(nginx_http_requests_total{status="499"}[5m]) > 1
别只看报错消失,验证要多做一步。蜘蛛侧 499 从每小时三百条降到二十条以内,抓取超时报表同步回落,列表页的 P95 响应时间减半。
容易忽略的是,499 看起来是客户端的问题,实际多半是服务端太慢,把它排除在监控之外等于主动丢掉最灵敏的信号。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
