温馨提示×

怎样找出nginx慢请求日志

小樊
34
2026-09-08 15:10:31
栏目: 编程语言

要找出 Nginx 的慢请求(响应慢)日志,通常有下面几种做法,从「最常用」到「更专业」逐步说明。


一、最常用:利用 Nginx 访问日志 + $request_time

1. 确保访问日志包含响应时间

nginx.conf 或站点配置中,确认 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"';

关键点:

  • $request_time:整个请求处理时间(客户端 → Nginx → 响应完成)
  • $upstream_response_time:后端(PHP/Java/Node 等)响应时间

2. 开启访问日志

access_log /var/log/nginx/access.log main;

3. 找出慢请求

假设你认为 超过 1 秒 算慢:

awk '$NF > 1' /var/log/nginx/access.log

如果 rt= 在最后:

awk -F'rt=' '{split($2,a," "); if(a[1]+0>1) print}' /var/log/nginx/access.log

更直观(按响应时间排序):

awk '{print $NF, $0}' /var/log/nginx/access.log | sort -rn | head -20

二、进阶:只记录慢请求(推荐)

避免日志太大,只记录慢请求

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

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

这样:

  • 正常请求不写
  • 慢请求单独记录到 slow.log

三、区分“Nginx 慢”还是“后端慢”

看这几个字段:

字段 含义
request_time 总耗时
upstream_response_time 后端耗时
upstream_connect_time 连接后端耗时

示例判断:

  • request_time 大,upstream_response_time 小 → Nginx / 网络问题
  • upstream_response_time 大 → 后端慢(DB、接口等)

四、用工具分析(更高效)

1. GoAccess(实时分析)

goaccess /var/log/nginx/access.log -o report.html

2. ngxtop(类 top 命令)

ngxtop

3. ELK / Grafana + Loki

适合生产环境长期监控慢请求。


五、临时排查技巧

实时看慢请求

tail -f /var/log/nginx/access.log | awk '{print $NF, $0}' | sort -rn

统计慢请求比例

total=$(wc -l < access.log)
slow=$(awk '$NF>1' access.log | wc -l)
echo "慢请求比例: $slow / $total"

六、常见慢请求原因(顺带提示)

  • 后端接口慢(DB 查询、第三方 API)
  • 静态资源过大
  • Nginx 未开 gzip
  • 反向代理 buffer 设置不合理
  • DNS 解析慢(proxy_pass 用域名)

如果你愿意,可以:

  • 贴一段 access_log 格式
  • 或说明是 静态站 / 反向代理 / PHP / Java

我可以帮你定制一条精准的慢请求分析命令

0