插件窝 干货文章 如何通过nginx日志监控服务器状态

如何通过nginx日志监控服务器状态

Nginx 日志 log http 657    来源:    2025-05-06

通过Nginx日志监控服务器状态是运维工作中的重要环节,以下是系统化的解决方案:

一、日志配置优化(nginx.conf) 1. 推荐日志格式(http模块内添加):

log_format  main_ext  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" '
                     'rt=$request_time uct="$upstream_connect_time" '
                     'uht="$upstream_header_time" urt="$upstream_response_time"';
  1. 关键字段说明:

- $request_time:请求处理总时间 - $upstream_*:后端服务耗时指标 - $status:HTTP状态码 - $body_bytes_sent:响应体大小

二、实时监控方案 1. 使用GoAccess实时分析:

goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --log-format=COMBINED
  1. 使用ngxtop工具:
ngxtop -l /var/log/nginx/access.log --group-by remote_addr

三、ELK Stack方案 1. Filebeat配置示例:

filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/*.log
  json.keys_under_root: true
  json.add_error_key: true

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  1. Kibana可视化建议:

- 状态码分布饼图 - 请求速率时间序列 - 响应时间百分位图 - 地理IP分布图

四、Prometheus监控方案 1. Nginx Exporter配置:

scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['nginx-exporter:9113']
  1. 关键监控指标:

- nginx_http_requests_total - nginx_http_request_duration_seconds - nginx_upstream_response_length

五、关键告警规则 1. 错误率告警(5分钟内5xx错误>5%):

sum(rate(nginx_http_requests_total{status=~"5.."}[5m])) by (host)
/
sum(rate(nginx_http_requests_total[5m])) by (host)
> 0.05
  1. 慢请求告警(p99>2s):
histogram_quantile(0.99, sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le, host)) > 2

六、日志分析脚本示例 1. 异常IP检测:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20
  1. 响应时间分析:
awk '{print $NF}' /var/log/nginx/access.log | grep rt= | cut -d= -f2 | sort -n | awk '
  BEGIN {
    sum = 0
    p50 = 0
    p95 = 0
    p99 = 0
  }
  NR == 1 { min = $1 }
  { sum += $1; arr[NR] = $1 }
  END {
    printf "Min: %.3fs\n", min
    printf "Max: %.3fs\n", arr[NR]
    printf "Avg: %.3fs\n", sum/NR
    printf "P50: %.3fs\n", arr[int(NR*0.50)]
    printf "P95: %.3fs\n", arr[int(NR*0.95)]
    printf "P99: %.3fs\n", arr[int(NR*0.99)]
  }'

七、进阶建议 1. 结构化日志: - 使用JSON格式日志输出 - 添加自定义业务标签(如用户ID、API版本等)

  1. 采样策略:

- 对健康检查请求降低日志级别 - 对静态资源请求单独记录日志

  1. 日志生命周期管理:

- 使用logrotate进行日志轮转 - 对历史日志进行压缩归档

通过以上方案组合,可以实现从基础监控到深度分析的完整监控体系。建议根据实际业务规模选择适合的方案组合,中小规模网站可采用GoAccess+脚本方案,大规模分布式系统建议采用ELK+Prometheus的全套方案。