Nginx日志是识别网站性能瓶颈的重要资源,特别是对于发现慢查询请求非常有帮助。以下是几种有效的方法来分析Nginx日志中的慢查询:
首先确保Nginx配置了记录请求处理时间:
log_format timed_combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log timed_combined;
关键字段:
- $request_time
:请求处理总时间(从接收到第一个字节到发送完最后一个字节)
- $upstream_response_time
:后端服务器处理时间(如果有反向代理)
# 找出最慢的10个请求
awk '{print $1, $NF}' /var/log/nginx/access.log | sort -k2 -nr | head -10
# 按请求时间分组统计
awk '{print $NF}' access.log | sort -n | uniq -c | sort -nr
# 查找处理时间超过5秒的请求
grep '" 5[0-9][0-9] ' /var/log/nginx/access.log | awk -F\" '{print $2}' | sort | uniq -c | sort -nr
goaccess /var/log/nginx/access.log --log-format=COMBINED
from collections import defaultdict
slow_requests = defaultdict(int)
with open('/var/log/nginx/access.log') as f:
for line in f:
parts = line.split()
try:
url = parts[6] # 假设URL在第7列
time = float(parts[-1]) # 假设请求时间在最后一列
if time > 1.0: # 超过1秒的请求
slow_requests[url] += 1
except (IndexError, ValueError):
continue
for url, count in sorted(slow_requests.items(), key=lambda x: x[1], reverse=True)[:10]:
print(f"{count}\t{url}")
import pandas as pd
df = pd.read_csv(
'/var/log/nginx/access.log',
sep=' ',
header=None,
usecols=[6, -1], # URL和请求时间列
names=['url', 'response_time']
)
# 找出最慢的10个URL
slowest = df[df['response_time'] > 1].groupby('url').agg({
'response_time': ['count', 'mean', 'max']
}).sort_values(('response_time', 'mean'), ascending=False).head(10)
print(slowest)
ngxtop:实时监控Nginx请求
ngxtop -l /var/log/nginx/access.log --group-by remote_addr
Prometheus + Grafana:配置Nginx exporter进行实时监控
对于频繁出现的慢查询URL,考虑:
设置慢查询阈值告警,及时发现性能问题
定期分析日志,建立性能基准,监控趋势变化
通过以上方法,您可以有效地从Nginx日志中识别出慢查询,并针对性地进行优化。