来源:运维派 | 发布日期:2025-08-11
Nginx 日志分析与监控体系构建指南
完善的 Nginx 日志分析与监控体系能从每天海量访问中快速发现性能瓶颈、错误趋势和安全威胁,将故障定位时间从小时级压缩到分钟级。
日志基础配置优化
自定义日志格式
默认 Nginx 日志格式信息有限,自定义 log_format 获取更多关键字段:
http {
# 标准分析格式
log_format main_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$upstream_addr "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main_format;
error_log /var/log/nginx/error.log warn;
}
关键字段说明:
$request_time— 客户端请求总耗时(排查慢请求核心指标)$upstream_response_time— 后端服务响应时间(区分 Nginx 自身 vs 后端瓶颈)$connection_requests— 单个连接处理的请求数(评估 keepalive 效果)$ssl_protocol/$ssl_cipher— TLS 协议与加密套件(安全审计)
日志分割与轮转
#!/bin/bash
# nginx_log_rotate.sh
LOG_PATH="/var/log/nginx"
DATE=$(date +%Y%m%d)
mv ${LOG_PATH}/access.log ${LOG_PATH}/access_${DATE}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error_${DATE}.log
nginx -s reopen # 重新打开日志文件
find ${LOG_PATH} -name "*.log" -mtime +7 -exec gzip {} \; # 压缩 7 天前
find ${LOG_PATH} -name "*.gz" -mtime +30 -delete # 删除 30 天前
配合系统 logrotate 或 cron 定时执行,避免单文件过大影响磁盘和查询性能。
核心分析技巧
性能分析
# 响应时间最慢的 10 个请求
awk '{print $10, $7}' /var/log/nginx/access.log | sort -nr | head -10
# 响应时间分布统计
awk '{if($10<0.1) fast++; else if($10<1) normal++; else if($10<3) slow++;
else very_slow++; total++} END {printf "快速(<0.1s): %d (%.2f%%)\n...", ...}'
状态码与错误监控
# HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 4xx/5xx 错误聚合
awk '$9 ~ /^[45]/ {print $9, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
流量与访问分析
# TOP 10 访问 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# TOP 10 请求 URI
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# 实时 QPS 统计
tail -f /var/log/nginx/access.log | awk '{print $4}' | uniq -c
可视化监控方案
GoAccess 实时监控
# 安装
apt install goaccess # Debian/Ubuntu
yum install goaccess # CentOS/RHEL
# 实时 HTML 报告
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html
# 定时生成静态报告
goaccess /var/log/nginx/access.log -o /var/www/html/report-$(date +%Y%m%d).html
GoAccess 支持面板包括:访问量趋势、来源 IP 地图、请求资源排名、状态码分布、响应时间热力图。
自动化告警脚本
#!/bin/bash
# nginx_alert.sh — 检测异常指标并告警
THRESHOLD_5XX=100 # 5xx 错误阈值
THRESHOLD_SLOW=50 # 慢请求阈值
LOG_FILE="/var/log/nginx/access.log"
# 检测 5xx 错误
ERROR_COUNT=$(tail -10000 $LOG_FILE | awk '$9 ~ /^5/ {count++} END {print count}')
if [ "$ERROR_COUNT" -gt "$THRESHOLD_5XX" ]; then
echo "[ALERT] 5xx errors: $ERROR_COUNT (threshold: $THRESHOLD_5XX)" | mail -s "Nginx Alert" [email protected]
fi
# 检测慢请求
SLOW_COUNT=$(tail -10000 $LOG_FILE | awk -v threshold=3 '$10 > threshold {count++} END {print count}')
if [ "$SLOW_COUNT" -gt "$THRESHOLD_SLOW" ]; then
echo "[ALERT] Slow requests: $SLOW_COUNT" | mail -s "Nginx Alert" [email protected]
fi
配合 cron 每分钟执行,第一时间发现异常。
日志采集体系建议
- 日志分流:按域名/应用拆分 access_log,避免单文件大而全
- 集中采集:Filebeat/Loki 统一采集到 Elasticsearch/Loki 集群
- 结构化存储:JSON 格式日志便于 ES/Loki 索引和查询
- 看板可视化:Grafana + Prometheus 或 ELK Kibana 搭建日志看板
- 告警路由:Error 率突增 → 企业微信/钉钉/飞书机器人通知
关联页面
| 页面 | 关联点 |
|---|---|
| nginx-config-pitfalls | Nginx 配置排坑 |
| nginx-security-config-guide | Nginx 安全配置 |
| nginx-pre-launch-checklist | Nginx 上线前检查清单 |
| ops-automation-scripts | 运维自动化脚本 |
| keepalived-ha-hidden-pitfalls | Keepalived+Nginx 高可用架构 3 个隐藏坑位与生产级防护方案(脑裂/健康检查僵尸进程 |
| fullstack-performance-troubleshooting | 全栈性能排障 |