多实例聚合监控看板的核心是Prometheus统一采集多Nginx实例指标,通过Grafana变量、标签过滤与sum/rate/avg等函数实现跨实例汇总;关键在于指标打标一致、抓取配置合理、查询逻辑清晰。

多实例聚合监控看板的核心是让 Prometheus 统一采集多个 Nginx 实例的指标,再通过 Grafana 的变量、标签过滤与聚合函数(如 sum、rate、avg)实现跨实例汇总分析。关键不在“装更多 exporter”,而在于指标打标一致、抓取配置合理、查询逻辑清晰。
确保每个 Nginx 实例暴露标准化指标
无论用 vts 模块 还是 nginx-prometheus-exporter,所有实例必须提供相同格式的指标,并携带可区分的标识标签:
- vts 方式:在每个 Nginx 的
nginx.conf中,为location /status/format/prometheus添加add_header X-Instance-ID "nginx-prod-a";(仅作识别参考),但更可靠的是靠 Prometheus 抓取时自动注入标签 - exporter 方式:启动时统一加
--web.listen-address=:9113 --nginx.scrape-uri=http://localhost:8080/nginx_status,并在 Prometheus 配置中用static_configs或服务发现明确标注实例身份 - 所有实例的
nginx_status或/status/format/prometheus接口必须能被 Prometheus 网络可达,且返回内容结构一致(如都有nginx_connections_active、nginx_http_requests_total等)
Prometheus 抓取配置:用 job + instance 标签区分来源
在 prometheus.yml 中,不写死单个 target,而是按逻辑分组,让每个 target 带上 job 和 instance 标签:
scrape_configs:
- job_name: 'nginx-vts'
static_configs:
- targets: ['10.1.1.10:8080', '10.1.1.11:8080', '10.1.1.12:8080']
labels:
env: 'prod'
role: 'api-gateway'
- job_name: 'nginx-exporter'
static_configs:
- targets: ['10.1.1.20:9113', '10.1.1.21:9113']
labels:
env: 'staging'
role: 'ingress-controller'
这样每条指标都会自动带上 job="nginx-vts"、instance="10.1.1.10:8080"、env="prod" 等标签,为后续聚合打下基础。
Grafana 看板:用变量+聚合查询构建全局视图
在 Grafana 新建仪表盘,添加变量和面板:
- 新建变量
env,数据源选 Prometheus,查询语句填:label_values(env),用于切换生产/测试环境 - 新建变量
role,查询:label_values({env=~"$env"}, role),联动筛选角色类型 - 创建「总请求数」面板,查询写成:
sum(rate(nginx_http_requests_total{env=~"$env", role=~"$role"}[5m])) by (job),展示各 job 下聚合 QPS - 创建「错误率 Top3 实例」面板,查询:
topk(3, 100 * sum(rate(nginx_http_request_seconds_sum{status=~"5.."}[5m])) by (instance) / sum(rate(nginx_http_request_seconds_count[5m])) by (instance)) - 避免直接画单个
instance曲线,改用sum by (job)或avg by (env),才能体现“聚合”价值
进阶:自动发现与标签继承(K8s 场景)
若 Nginx 运行在 Kubernetes,推荐用 ServiceMonitor 或 PodMonitor(配合 Prometheus Operator):
- 给每个 nginx-ingress-controller Pod 打上
app.kubernetes.io/name: nginx-ingress和monitoring: enabled标签 - ServiceMonitor 中设置
targetLabels: [namespace, app],让指标自动继承命名空间和应用名 - Grafana 查询即可写:
sum by (namespace) (rate(nginx_ingress_controller_nginx_process_requests_total[5m])),一键看到各 namespace 总流量


















