排查 Nginx 慢请求,一般从 日志分析 + 配置优化 + 链路定位 三个方面入手。下面按实战步骤说明。
默认 Nginx 日志不一定记录耗时,需要加变量:
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';
access_log /var/log/nginx/access.log main;
关键字段说明:
request_time:客户端整个请求耗时(含网络)upstream_response_time:后端处理耗时(最常用)upstream_connect_time:连接后端耗时upstream_header_time:后端返回 header 耗时改完重启:
nginx -t
nginx -s reload
awk '{print $NF, $7}' /var/log/nginx/access.log | sort -rn | head
或按 request_time 排序(假设第 12 列):
awk '{print $12, $7}' access.log | sort -rn | head
awk '$12 > 1.0 {print}' access.log
awk '{url[$7]+=$12; cnt[$7]++} END {for (u in url) print url[u]/cnt[u], u}' access.log | sort -rn | head
request_time 大,但 upstream_response_time 小✅ 问题在:
排查:
nginx -V | grep ssl
upstream_response_time 大✅ 问题在后端(PHP / Java / Node / Python)
排查方向:
Nginx 侧可加:
proxy_read_timeout 10s;
proxy_connect_timeout 5s;
✅ 可能是:
配合系统命令:
top
iotop
df -h
dmesg | tail
slowlog(Nginx Plus / OpenResty)OpenResty 示例:
if tonumber(ngx.var.upstream_response_time) > 1 then
ngx.log(ngx.ERR, "SLOW:", ngx.var.request_uri)
end
upstream_response_time 画 P95 / P99proxy_cache如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一类慢。