站点迁到 nginx 1.24 后跑了一周,access.log 里 499 状态码稳定占到三成,其中一半 UA 是 Googlebot 和 Baiduspider。源站 CPU 常年在 20% 以下,upstream_response_time 大多在 0.6 秒左右。一开始按限流排查,把 limit_req 从 5r/s 放宽到 20r/s,499 条数只降了不到一成。
这类报错背后常见的原因有几处,逐个排除就行。499 是客户端在超时前主动断开,nginx 记的是关闭时刻而不是服务端出错;蜘蛛默认只等 1 到 2 秒,首字节时间超过这个值就会被记成 499;PHP 页面里有同步调用第三方接口,个别请求偶尔卡到 2.5 秒以上;CDN 回源超时短于源站处理时间,边缘断开后源站同样记 499。
先按 UA 把蜘蛛的 499 单独切出来看占比
awk '$9==499 && $0~/Googlebot/{c++} END{print c}' access.log
随后按小时统计 499 分布,看是否和大流量时段重合
awk '$9==499{print $4}' access.log | cut -c14-18 | sort | uniq -c | sort -rn | head -10
接着把上游耗时超过 1 秒的请求单独挑出来,定位具体接口
awk '$9==499 && $NF+0>1.0{print $7,$NF}' access.log | sort | uniq -c | sort -rn
剩下的就是确认 nginx 的 fastcgi 读取超时配置
grep -n 'fastcgi_read_timeout' /etc/nginx/conf.d/*.conf
改完先别撤,确认这几项。同一批 URL 再抓一次,蜘蛛请求的 499 占比降到 3% 以内,日志里 0.6 秒以上的慢请求基本消失。
提醒一点。调整超时只是把断开的时间点往后挪,真正要改的是那几处同步外部调用,加一层缓存比改数字更有效。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
