事情本身不复杂,线索都在日志里。access.log 里慢请求的 $request_time 全是 0.00,只有超过一秒才偶尔出现数字,想定位蜘蛛抓取超时的接口根本看不出耗时,日志格式里只写了 $request_time。

把日志和配置对完,能解释这个现象的基本就这几处。$request_time 以秒为单位且默认只保留两位,几十毫秒的差异全部被抹平。少数情况下是上游耗时没有单独记录,PHP 慢还是数据库慢分不清。

少数情况下是日志按天切分后旧格式还混在里面,统计口径不一致。

第一件事是改用毫秒并把上游时间一起记

log_format timed '$remote_addr $request $status $request_time $upstream_response_time $msec';

再往下重新加载配置并抽查输出

nginx -s reload && tail -3 /var/log/nginx/access.log

剩下的就是按耗时排序找出最慢的蜘蛛请求

awk '{print $4, $5, $7}' access.log | sort -k2 -nr | head -20

怎么算真的好了,看的是同一批现象。日志里能看到 0.043 这类毫秒级数值,upstream_response_time 与 request_time 的差值稳定在 5ms 以内,超时请求可以按行定位到具体接口。

容易忽略的是,开了缓冲和 gzip 之后 request_time 会算上发送时间,判断后端慢要看 upstream_response_time。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189