温馨提示×

nginx日志慢请求怎么看

小樊
34
2026-09-17 19:23:05
栏目: 编程语言

查看 Nginx 的慢请求(响应慢的请求),一般从「日志分析」和「配置增强」两方面入手。下面按实战方式给你说明。


一、先看 Nginx 访问日志(最常用)

1. 确认日志格式里有没有响应时间

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:后端响应头时间

2. 找出慢请求(命令行)

假设日志在 /var/log/nginx/access.log

查看最慢的 10 个请求

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

筛选超过 1 秒的请求

awk '$NF > 1.0' access.log

二、用 Nginx 自带变量定位“慢在哪”

1. 是 Nginx 慢还是后端慢?

  • request_time 大,upstream_response_time
    → Nginx 或网络问题(如客户端网速慢)
  • upstream_response_time
    后端接口慢(DB、接口、锁)

三、开启「慢日志」思路(Nginx 本身不支持 PHP 那种 slow log)

Nginx 没有官方“slow request log”,但可以用以下方式:

方案 1:通过 map + 条件日志(推荐)

map $request_time $is_slow {
    default 0;
    "~^[1-9]" 1;   # 大于 1 秒
}

server {
    access_log /var/log/nginx/slow.log main if=$is_slow;
}

这样只会记录慢请求,方便排查。


方案 2:结合 upstream 超时

location /api/ {
    proxy_pass http://backend;
    proxy_read_timeout 3s;
}

超时会在 error.log 里看到:

upstream timed out

四、配合 error.log 看异常

tail -f /var/log/nginx/error.log

常见慢相关:

  • upstream timed out
  • connect() failed
  • worker_connections are not enough

五、进阶:用工具分析

  • goaccess:实时看慢请求
  • ngxtop:类 top 命令
  • ELK / Grafana + Prometheus:长期监控

六、总结排查顺序

  1. access.log$request_time
  2. 对比 $upstream_response_time
  3. 分离是网络 / Nginx / 后端问题
  4. 用条件日志单独存慢请求
  5. 后端再做链路 / SQL 慢查询分析

如果你愿意,可以把你的 nginx.conf 的 log_format 或一段真实日志贴出来,我可以直接帮你写分析命令。

0