定位 Nginx 慢请求(响应慢、耗时长的请求)通常从日志配置 + 分析手段两方面入手。下面按实战步骤说明。
$request_time 记录请求耗时在 nginx.conf 的 http 或 server 中定义日志格式:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status '
'upstream=$upstream_addr '
'request_time=$request_time '
'upstream_time=$upstream_response_time';
关键点:
request_time:客户端整个请求耗时(含连接、处理、传输)upstream_response_time:后端处理耗时(反代场景非常重要)在 server 或 location 中使用:
access_log /var/log/nginx/access.log main;
通过 if + map 实现“只记录慢请求”
map $request_time $is_slow {
default 0;
~^([5-9]\.|[0-9]{2,}) 1; # 超过 5 秒
}
server {
access_log /var/log/nginx/slow.log main if=$is_slow;
}
这样只会把慢请求写入 slow.log,便于分析。
awk '{print $NF}' /var/log/nginx/access.log | sort -nr | head
更实用(假设 request_time 在最后):
awk '{print $request_time, $request}' access.log | sort -nr | head
awk '$request_time > 3 {print}' access.log
如果:
request_time 很大upstream_response_time 很小说明问题在 Nginx 到客户端网络 / 连接 / 带宽
如果反过来:
upstream_response_time 很大说明问题在 后端服务(PHP / Java / Python / DB)
✅ 解决:优化后端 / 加缓存 / 限流
ngxtop -l /var/log/nginx/access.log
goaccess access.log -o report.html
开启
request_time + upstream_response_time日志 → 拆分慢请求日志 → 对比前后端耗时 → 定位是后端、Nginx 还是网络问题
如果你愿意,我可以帮你写一份完整可直接用的 Nginx 慢请求配置示例。