在 Nginx 中,**“慢日志”**通常不是像 MySQL 那样自带一个 slow log,而是通过 访问日志 + 响应时间字段 来分析“哪些请求慢”。下面按常见场景给你讲清楚。
打开 nginx 配置(一般在 /etc/nginx/nginx.conf 或站点配置里):
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$request_time $upstream_response_time';
关键字段说明:
$request_time:Nginx 从接收请求到返回给客户端的总耗时(秒)$upstream_response_time:后端(PHP / Java / 反向代理)处理耗时✅ 如果日志里没有这两个字段,需要先加上,然后 nginx -s reload
常见位置:
/var/log/nginx/access.log
/var/log/nginx/xxx.access.log
查看:
tail -f /var/log/nginx/access.log
示例日志:
10.0.0.1 - - [10/Oct/2024:10:00:01 +0800] "GET /api/test HTTP/1.1" 200 1024 2.531 2.510
含义:
2.531s2.510sawk '{print $NF, $(NF-1), $7}' access.log | sort -rn | head -20
假设最后两个字段是
request_time upstream_time
或者更直观:
awk '{print $request_time, $request}' access.log | sort -rn | head
awk '$NF > 1.0 {print}' access.log
或(如果 request_time 是第 10 列):
awk '$10 > 1.0' access.log
awk '$NF > 1.0 {print $7}' access.log | sort | uniq -c | sort -rn | head
tail -f access.log | awk '$NF > 1.0'
map + 条件日志map $request_time $is_slow {
default 0;
~^[1-9] 1;
}
server {
access_log /var/log/nginx/slow.log main if=$is_slow;
}
这样:
request_time ≥ 1s 的会写入 slow.loglog_format proxy '$request_time $upstream_response_time $request';
重点看:
upstream_response_time 高 → 后端慢request_time 高但 upstream 低 → Nginx / 网络问题| 现象 | 可能原因 |
|---|---|
| request_time 高 | 客户端网络差 |
| upstream_time 高 | 后端接口慢 |
| 静态文件慢 | 磁盘 IO / 防盗链 |
| 偶发慢 | DNS、连接数、TIME_WAIT |
如果你愿意,可以:
我可以直接帮你写 精准的慢日志分析命令。