温馨提示×

nginx日志怎么排查慢请求

小樊
52
2026-09-29 19:16:00
栏目: 编程语言

排查 Nginx 慢请求,一般从 日志分析 + 配置优化 + 链路定位 三个方面入手。下面按实战步骤说明。


一、先确认 Nginx 日志是否能看到“慢”

1. 开启响应时间日志(最关键)

默认 Nginx 日志不一定记录耗时,需要加变量:

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';

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

关键字段说明:

  • request_time:客户端整个请求耗时(含网络)
  • upstream_response_time:后端处理耗时(最常用)
  • upstream_connect_time:连接后端耗时
  • upstream_header_time:后端返回 header 耗时

改完重启:

nginx -t
nginx -s reload

二、从 access.log 中找慢请求

1. 找出响应最慢的请求

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

或按 request_time 排序(假设第 12 列):

awk '{print $12, $7}' access.log | sort -rn | head

2. 只看超过 1s 的请求

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

3. 按 URL 聚合平均耗时

awk '{url[$7]+=$12; cnt[$7]++} END {for (u in url) print url[u]/cnt[u], u}' access.log | sort -rn | head

三、区分“慢在哪里”

情况 1:request_time 大,但 upstream_response_time 小

✅ 问题在:

  • 客户端网络慢
  • 请求体/响应体大
  • TLS 握手慢

排查:

nginx -V | grep ssl
  • 是否启用 HTTP/2
  • 是否开启 gzip

情况 2:upstream_response_time 大

✅ 问题在后端(PHP / Java / Node / Python)

排查方向:

  • 数据库慢查询
  • 接口阻塞
  • 后端线程/连接池不足

Nginx 侧可加:

proxy_read_timeout 10s;
proxy_connect_timeout 5s;

情况 3:偶发慢,不是一直慢

✅ 可能是:

  • 后端重启
  • GC
  • 磁盘 IO
  • 系统负载高

配合系统命令:

top
iotop
df -h
dmesg | tail

四、进阶:慢日志 & 监控

1. 使用 slowlog(Nginx Plus / OpenResty)

OpenResty 示例:

if tonumber(ngx.var.upstream_response_time) > 1 then
    ngx.log(ngx.ERR, "SLOW:", ngx.var.request_uri)
end

2. 搭配 ELK / Grafana

  • Filebeat 收集 access.log
  • 按 upstream_response_time 画 P95 / P99

五、常见优化点(顺手做)

  • 开启 gzip
  • 启用 HTTP/2
  • 后端连接池
  • 静态资源走 proxy_cache
  • 限制大请求体

如果你愿意,可以把:

  • Nginx 版本
  • 是静态站还是反代
  • 一段脱敏 access.log

发出来,我可以直接帮你定位是哪一类慢。

0 踩