Ubuntu 上搭建 Nginx 监控与告警的实用方案
一 监控目标与基础指标
- 建议优先覆盖四类关键指标:
- 延迟:关注 $request_time、$upstream_response_time,绘制 TP95/TP99 曲线,结合业务容忍度设置阈值。
- 错误:监控 HTTP 5xx/4xx,尤其是 500/502/504;同时采集 error.log 中的关键错误。
- 流量:关注 PV/UV、关键接口与后端命中率,识别突增/突降。
- 饱和度:关注 CPU、连接数/队列、磁盘 IO;最大可承受连接数约为 worker_processes × worker_connections。
- 建议启用 ngx_http_stub_status_module 获取连接与请求的基础计数,用于存活与饱和度观测。
二 方案一 Prometheus + Alertmanager + Nginx Exporter(推荐)
- 启用 Nginx 状态页
在 server 配置中增加:
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
重启后在 http://服务器IP/nginx_status 可查看 Active/Reading/Writing/Waiting 与总请求数。 - 部署 Nginx Exporter(以官方 nginx-prometheus-exporter 为例)
启动示例:
docker run -d –name nginx-exporter
-p 9113:9113
nginx/nginx-prometheus-exporter:latest
-nginx.scrape-uri=http:///nginx_status
访问 http://:9113/metrics 应看到 nginx 指标。 - 配置 Prometheus 抓取
在 prometheus.yml 增加:
scrape_configs:- job_name: ‘nginx’
static_configs:- targets: [‘:9113’]
- job_name: ‘nginx’
- 配置 Alertmanager 邮件告警
alertmanager.yml 示例:
global:
smtp_smarthost: ‘smtp.example.com:587’
smtp_from: ‘alertmanager@example.com’
smtp_auth_username: ‘alertmanager’
smtp_auth_password: ‘password’
smtp_ssl: true
route:
receiver: ‘email’
receivers:- name: ‘email’
email_configs:- to: ‘admin@example.com’
- name: ‘email’
- Prometheus 告警规则示例(/etc/prometheus/rules/alert.rules)
groups:- name: nginx
rules:- alert: InstanceDown
expr: up{job=“nginx”} == 0
for: 1m
labels: severity: critical
annotations:
summary: “Nginx exporter down ({{ $labels.instance }})”
description: “Nginx exporter has been down for more than 1 minute.” - alert: NginxHigh5xx
expr: sum(rate(nginx_http_requests_total{status=~“5…”}[5m])) by (instance) / sum(rate(nginx_http_requests_total[5m])) by (instance) > 0.05
for: 2m
labels: severity: critical
annotations:
summary: “High 5xx rate on {{ $labels.instance }}”
description: “5xx rate is {{ $value | humanizePercentage }} over the last 5 minutes.” - alert: NginxHighLatency
expr: histogram_quantile(0.95, sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le,instance)) > 1
for: 5m
labels: severity: warning
annotations:
summary: “High 95th percentile latency on {{ $labels.instance }}”
description: “95th percentile request latency is {{ $value }}s over the last 5 minutes.”.
- alert: InstanceDown
- name: nginx
三 方案二 ELK 或 Grafana Loki 日志告警
- ELK(Filebeat → Logstash → Elasticsearch → Kibana)
- Filebeat 采集 /var/log/nginx/access.log 与 error.log;
- Logstash 用 Grok 解析日志,结构化后写入 ES;
- Kibana 建立索引模式与可视化仪表盘;
- 使用 Watcher 或 Kibana Alerting 配置阈值/异常规则(如 5xx 比例、403/404 突增、特定路径扫描)。
- Grafana Loki + Promtail + Grafana
- Promtail 采集 Nginx 日志并打标签;
- Loki 存储与查询;
- Grafana 建立日志面板,用 Grafana Alerting 基于 LogQL 触发告警(如 rate({job=“nginx”} |= " 5xx "))。
四 轻量快速方案与运维要点
- 轻量快速方案
- 实时查看:tail -f /var/log/nginx/access.log /var/log/nginx/error.log
- 可视化分析:GoAccess
goaccess /var/log/nginx/access.log -a -c -d –log-format=COMBINED -o report.html
实时 HTML:goaccess … –real-time-html –port=7890 - 安全与滥用防护:Fail2Ban 针对探测与暴力路径(如 /wp-admin、.env)自动封禁。
- 日志轮转与权限
/var/log/nginx/*.log {
daily; missingok; rotate 7; compress; delaycompress; notifempty;
create 0640 www-data adm; sharedscripts;
postrotate
if [ -f /var/run/nginx.pid ]; then kill -USR1cat /var/run/nginx.pid; fi
endscript
}
确保 /var/log/nginx/ 权限与属主正确,避免采集/告警失败。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/1486574.html