返回首页

Nginx 日志分析与监控体系构建指南

📅 创建于 2026-05-27 🔄 更新于 2026-05-27 📝 460 字

来源:运维派 | 发布日期: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 每分钟执行,第一时间发现异常。

日志采集体系建议

  1. 日志分流:按域名/应用拆分 access_log,避免单文件大而全
  2. 集中采集:Filebeat/Loki 统一采集到 Elasticsearch/Loki 集群
  3. 结构化存储:JSON 格式日志便于 ES/Loki 索引和查询
  4. 看板可视化:Grafana + Prometheus 或 ELK Kibana 搭建日志看板
  5. 告警路由:Error 率突增 → 企业微信/钉钉/飞书机器人通知

关联页面

页面关联点
nginx-config-pitfallsNginx 配置排坑
nginx-security-config-guideNginx 安全配置
nginx-pre-launch-checklistNginx 上线前检查清单
ops-automation-scripts运维自动化脚本
keepalived-ha-hidden-pitfallsKeepalived+Nginx 高可用架构 3 个隐藏坑位与生产级防护方案(脑裂/健康检查僵尸进程
fullstack-performance-troubleshooting全栈性能排障