Nginx日志是识别网站性能瓶颈的宝贵资源。以下是系统性的分析方法:
首先确保Nginx日志记录了足够的信息:
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time $upstream_connect_time '
'$upstream_header_time';
access_log /var/log/nginx/access.log detailed;
关键字段说明:
- $request_time
:请求处理总时间
- $upstream_response_time
:后端响应时间
- $upstream_connect_time
:连接后端时间
- $upstream_header_time
:接收第一个响应头时间
# 统计最慢的请求
awk '{print $1, $NF}' access.log | sort -k2 -nr | head -20
# 按响应时间统计
awk '{print $NF}' access.log | sort -n | awk '
{ data[NR] = $1 }
END {
print "Min: " data[1];
print "50th: " data[int(NR*0.50)];
print "95th: " data[int(NR*0.95)];
print "99th: " data[int(NR*0.99)];
print "Max: " data[NR];
}'
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 找出响应时间超过5秒的请求
awk -F'"' '{print $6}' access.log | awk '$1 > 5 {print $0}'
awk '{print $7, $NF}' access.log | sort -k2 -nr | head -20
# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找出5xx错误
grep ' 50[0-9] ' access.log | awk '{print $7, $9}' | sort | uniq -c | sort -rn
# 比较$request_time和$upstream_response_time差异大的请求
awk '{if ($NF-$(NF-1) > 1) print $0}' access.log
# 分析高峰时段请求
awk '{print $4}' access.log | cut -d: -f1,2 | uniq -c
# 统计爬虫/浏览器分布
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn
# 统计流量最大的URL
awk '{print $10, $7}' access.log | sort -nr | head -20
高$request_time但低$upstream_response_time
高$upstream_response_time
大量4xx/5xx错误
特定URL响应慢
高峰时段性能下降
通过系统性地分析Nginx日志,您可以准确地定位网站性能瓶颈并采取针对性的优化措施。