简介:本文详细介绍如何使用Prometheus监控Nginx服务,涵盖Nginx指标暴露、Prometheus配置、监控面板搭建及告警策略设计,助力运维人员实现Nginx服务的全面可视化监控与异常预警。
Nginx作为现代Web架构的核心组件,承担着反向代理、负载均衡、静态资源服务等关键职责。其性能直接影响用户体验和业务连续性。然而,传统监控方式(如日志分析、基础命令)存在三大痛点:
Prometheus凭借其时序数据库特性、强大的查询语言(PromQL)和灵活的告警机制,成为监控Nginx的理想选择。通过采集Nginx的度量指标,可以实现:
location /nginx_status {stub_status on;access_log off;allow 127.0.0.1;deny all;}
优势:
局限:
推荐使用nginx-prometheus-exporter,其架构如下:
Nginx → stub_status/Lua脚本 → Exporter → Prometheus
核心功能:
$upstream_*变量监控部署示例:
docker run -d --name nginx-exporter \-p 9113:9113 \nginx/nginx-prometheus-exporter:latest \-nginx.scrape-uri=http://nginx-server/nginx_status
对于需要监控请求体大小、自定义Header等场景,可通过OpenResty的Lua模块实现:
local prometheus = require("prometheus")local metric_requests = prometheus.counter("nginx_http_requests_total","Total HTTP requests",{"method", "status"})ngx.ctx.prometheus = prometheus-- 在access阶段记录指标metric_requests:inc(1, {ngx.req.get_method(), ngx.var.status})
# prometheus.ymlscrape_configs:- job_name: 'nginx'static_configs:- targets: ['nginx-exporter:9113']metrics_path: '/metrics'relabel_configs:- source_labels: [__address__]target_label: instance
| 指标名称 | 类型 | 监控意义 |
|---|---|---|
| nginx_up | Gauge | 服务可用性(1=健康,0=故障) |
| nginx_http_requests_total | Counter | 请求总量(按方法/状态码分类) |
| nginx_connections_active | Gauge | 当前活跃连接数 |
| nginx_server_bytes_total | Counter | 上下游流量统计 |
| nginx_upstream_response_time | Histogram | 上游服务响应时间分布 |
# 计算5分钟内错误率突增rate(nginx_http_requests_total{status="5xx"}[5m])/rate(nginx_http_requests_total[5m]) > 0.05# 识别高延迟请求histogram_quantile(0.95,sum(rate(nginx_upstream_response_time_bucket[1m]))by (le)) > 1.5
第一行:全局概览
第二行:连接状态
第三行:上游监控
# alerts.ymlgroups:- name: nginx.rulesrules:- alert: HighErrorRateexpr: rate(nginx_http_requests_total{status="5xx"}[5m])/ rate(nginx_http_requests_total[5m]) > 0.1for: 2mlabels:severity: criticalannotations:summary: "Nginx {{ $labels.instance }} 错误率过高"description: "5xx错误率达到{{ $value | humanizePercentage }}"- alert: LowThroughputexpr: rate(nginx_http_requests_total[1m]) < 10for: 5mlabels:severity: warningannotations:summary: "Nginx {{ $labels.instance }} 流量过低"
relabel_configs:- regex: __address__replacement: "prod-nginx-01"target_label: cluster
curl http://exporter:9113/metrics | grep nginx_up
sum(rate(nginx_http_requests_total[1m])) by (status)
journalctl -u nginx -f | grep "upstream timed out"
基于历史数据建立预测模型:
# 示例:线性回归预测QPSimport pandas as pdfrom sklearn.linear_model import LinearRegressiondata = pd.read_csv('nginx_metrics.csv')model = LinearRegression().fit(data[['timestamp']],data['requests_per_second'])next_week = model.predict([[1650000000]]) # Unix时间戳
通过blackbox_exporter监控证书有效期:
modules:http_2xx:prober: httptimeout: 5shttp:valid_status_codes: []tls_config:insecure_skip_verify: false
结合Nginx的geo模块和Prometheus标签:
geo $country {default US;CN China;JP Japan;}log_format geo_log '$country $remote_addr $request';
监控limit_req_status模块指标:
sum(rate(nginx_limit_req_status_total{status="rejected"}[1m]))by (zone)
通过Prometheus监控Nginx服务,运维团队可以构建从基础设施到应用层的全链路可视化体系。未来发展方向包括:
建议运维人员定期进行监控有效性验证,确保告警规则与业务影响对齐。对于超大规模部署,可考虑采用Thanos或Cortex进行分布式存储和查询优化。