线上接口 P99 到 2.3 秒,access.log 只有 combined 格式,看不出是 Nginx 还是上游慢。乍看像缓存或者权限的锅,追下去往往不是。
log_format main '$remote_addr - $request_time $upstream_response_time '
'$status $upstream_status $request';
access_log /var/log/nginx/access.log main;
awk '{print $2}' access.log | sort -n | tail -1
追下去是这么回事:默认 log_format 不带耗时字段,只有状态码和字节数。没有 request_time 和 upstream_response_time,无法区分连接、等待和传输各占多少。
「日志耗时字段」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,定义新的 log_format 带上 request_time 和 upstream_response_time;把 upstream_addr 和 upstream_status 一起加上 方便定位机器;在 server 或 location 里引用新格式 不要只改 http 段;用 awk 统计最大值 验证字段是否可用。
验收就看一点,access.log 每行都有两个耗时数字 能看出慢在 Nginx 等待还是上游处理。
