查看 Nginx 的慢请求(响应慢的请求),一般从「日志分析」和「配置增强」两方面入手。下面按实战方式给你说明。
Nginx 默认日志一般没有响应时间,需要看是否配置了 $request_time。
典型带耗时的 log_format:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time uct=$upstream_connect_time '
'uht=$upstream_header_time urt=$upstream_response_time';
关键字段说明:
rt($request_time):整体请求耗时(客户端到 Nginx 再到客户端)urt($upstream_response_time):后端处理耗时(最重要,慢通常是这里)uct:连接后端时间uht:后端响应头时间假设日志在 /var/log/nginx/access.log
awk '{print $NF, $0}' access.log | sort -rn | head -10
(假设 $request_time 在最后一列)
awk -F'rt=' '{print $2}' access.log | awk '{print $1}' | sort -rn | head
awk '$NF > 1.0' access.log
request_time 大,upstream_response_time 小upstream_response_time 大Nginx 没有官方“slow request log”,但可以用以下方式:
map $request_time $is_slow {
default 0;
"~^[1-9]" 1; # 大于 1 秒
}
server {
access_log /var/log/nginx/slow.log main if=$is_slow;
}
这样只会记录慢请求,方便排查。
location /api/ {
proxy_pass http://backend;
proxy_read_timeout 3s;
}
超时会在 error.log 里看到:
upstream timed out
tail -f /var/log/nginx/error.log
常见慢相关:
upstream timed outconnect() failedworker_connections are not enoughgoaccess:实时看慢请求ngxtop:类 top 命令access.log 的 $request_time$upstream_response_time如果你愿意,可以把你的 nginx.conf 的 log_format 或一段真实日志贴出来,我可以直接帮你写分析命令。