7.6.4 访问与错误日志关键指标
本节聚焦于访问日志与错误日志中的关键指标,旨在帮助运维人员快速判断服务状态、定位问题并指导容量规划。访问日志侧重业务流量与请求特征,错误日志侧重异常与系统状态;二者结合可形成完整的运行画像。
一、访问日志关键指标(含配置与示例)
1. 日志格式与开启关键字段
- 配置文件示例(/etc/nginx/nginx.conf),包含常用性能字段:
http {
log_format main_ext '$remote_addr $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time '
'uct=$upstream_connect_time '
'urt=$upstream_response_time '
'uht=$upstream_header_time';
access_log /var/log/nginx/access.log main_ext;
}
- 字段说明
rt=Nginx总耗时,urt=上游响应耗时,uct=连接上游耗时,uht=上游首包时间。
- 请求量指标(QPS/PV/UV)
- 按分钟QPS统计:
# 统计某分钟的请求数(QPS)
grep "20/Jun/2024:10:15" /var/log/nginx/access.log | wc -l
- UV粗略统计(基于IP):
awk '{print $1}' /var/log/nginx/access.log | sort | uniq | wc -l
- 响应状态指标(2xx/3xx/4xx/5xx)
# 统计状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
- 排错提示:4xx激增通常为接口滥用或参数错误;5xx激增多为后端异常或上游不可用。
- 性能与延迟指标(rt/urt/uct)
# 统计请求耗时超过1秒的请求
awk '$NF ~ /^urt=/ {split($NF,a,"="); if(a[2]>1) print $0}' /var/log/nginx/access.log | head
- 诊断思路
rt高且urt高:后端慢
rt高而urt低:Nginx本地处理或网络问题
- 流量与带宽指标(body_bytes_sent)
# 统计当天总出流量(字节)
awk '{sum+=$10} END{print sum " bytes"}' /var/log/nginx/access.log
- 来源与分布指标(IP/UA/Referer)
# Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
# Top 10 User-Agent
awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
二、错误日志关键指标(含示例与排错)
1. 错误级别统计
# 统计错误级别
awk '{print $3}' /var/log/nginx/error.log | sort | uniq -c | sort -nr
- 典型错误与定位
-upstream timed out:上游响应超时
处理:检查后端耗时与连接数,必要时调大超时
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
connect() failed:上游连接失败
处理:检查后端端口、健康检查、网络连通性
# 验证端口可达
nc -vz 10.0.0.10 8080
-
no live upstreams:上游全部不可用
处理:检查 upstream 配置与后端状态 -
worker_connections are not enough:连接数耗尽
处理:提高连接数与文件句柄
events {
worker_connections 4096;
}
ulimit -n 65535
三、指标关联与诊断方法(关联示例)
- 高5xx + urt升高:后端性能问题
- 4xx突增 + 单IP集中:疑似恶意扫描
- QPS上升 + rt上升:容量不足或缓存失效
- 带宽上升 + 3xx增多:跳转链路异常或配置问题
四、安装与工具示例(GoAccess快速统计)
# 安装(CentOS/RHEL)
yum install -y epel-release
yum install -y goaccess
# 生成报表
goaccess /var/log/nginx/access.log \
--log-format='%h %^ [%d:%t %^] "%r" %s %b "%R" "%u" rt=%T uct=%^ urt=%^ uht=%^' \
--date-format='%d/%b/%Y' \
--time-format='%H:%M:%S' \
-o /tmp/nginx_report.html
- 预期效果:生成HTML报表,可查看QPS、状态码、慢请求等指标。
五、常见排错步骤(基于日志)
1. 发现5xx激增 → 先查错误日志:
tail -n 200 /var/log/nginx/error.log
- 若出现
upstream timed out→ 查慢请求:
awk '$NF ~ /^urt=/ {split($NF,a,"="); if(a[2]>1) print $0}' /var/log/nginx/access.log | head
- 若出现
connect() failed→ 检查端口:
ss -tnlp | grep 8080
六、练习
1. 编写 log_format 增加 $request_length 字段,并统计请求体大于1MB的请求数。
2. 从访问日志中统计前10个5xx接口路径,并给出可能原因。
3. 通过错误日志定位一次 no live upstreams 的原因,给出修复方案。