温馨提示×

nginx访问慢日志怎么看

小樊
45
2026-09-02 14:15:08
栏目: 编程语言

在 Nginx 中,**“慢日志”**通常不是像 MySQL 那样自带一个 slow log,而是通过 访问日志 + 响应时间字段 来分析“哪些请求慢”。下面按常见场景给你讲清楚。


一、先确认:Nginx 有没有记录响应时间

1. 查看 nginx 访问日志格式

打开 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.531s
  • 后端耗时:2.510s

三、常用“看慢请求”的方法

1️⃣ 按响应时间排序(最常用)

awk '{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

2️⃣ 只看超过 1 秒的请求

awk '$NF > 1.0 {print}' access.log

或(如果 request_time 是第 10 列):

awk '$10 > 1.0' access.log

3️⃣ 统计慢请求最多的 URL

awk '$NF > 1.0 {print $7}' access.log | sort | uniq -c | sort -rn | head

4️⃣ 实时看慢请求(线上排查)

tail -f access.log | awk '$NF > 1.0'

四、如果你是想“主动记录慢日志”(类似 slow log)

方法 1:用 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.log

方法 2:反向代理场景看后端慢

log_format proxy '$request_time $upstream_response_time $request';

重点看:

  • upstream_response_time 高 → 后端慢
  • request_time 高但 upstream 低 → Nginx / 网络问题

五、常见慢的原因速查

现象 可能原因
request_time 高 客户端网络差
upstream_time 高 后端接口慢
静态文件慢 磁盘 IO / 防盗链
偶发慢 DNS、连接数、TIME_WAIT

如果你愿意,可以:

  • 贴一段 你的 nginx 日志格式
  • 或说明是 静态站 / 反向代理 / PHP / Java

我可以直接帮你写 精准的慢日志分析命令

0