要找出 Nginx 的慢请求(响应慢)日志,通常有下面几种做法,从「最常用」到「更专业」逐步说明。
$request_time在 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"';
关键点:
access_log /var/log/nginx/access.log main;
假设你认为 超过 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看这几个字段:
| 字段 | 含义 |
|---|---|
| request_time | 总耗时 |
| upstream_response_time | 后端耗时 |
| upstream_connect_time | 连接后端耗时 |
示例判断:
goaccess /var/log/nginx/access.log -o report.html
ngxtop
适合生产环境长期监控慢请求。
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"
如果你愿意,可以:
我可以帮你定制一条精准的慢请求分析命令。