需使用nginx-module-vts模块并配置vhost_traffic_status_display_format json,配合v0.12.0+版本Nginx Exporter抓取/status/format/json接口,使Prometheus采集到带pid标签的worker级指标(如nginx_worker_connections_active{pid="12345"}),进而实现各worker进程的独立监控、负载均衡分析与异常告警。

要监控 Nginx 各 worker 进程的独立状态(比如每个进程的活跃连接数、请求数、运行时长等),关键不是调大 worker_processes,而是让 Prometheus 能采集到带 pid 标签的细粒度指标。原生 stub_status 不支持 worker 级区分,必须借助支持进程维度的方案。
启用带 pid 标签的 worker 指标暴露
Nginx 默认不输出每个 worker 的独立指标。需满足以下任一条件:
- 使用 nginx-module-vts 并配置
vhost_traffic_status_display_format json,再通过 Exporter 抓取/status/format/json—— 该响应中会为每个 worker 进程生成独立条目,Exporter(v0.12.0+)可自动提取pid作为标签 - 或使用 nginx-plus(商业版),其
/api接口原生返回含pid的 worker 状态 - 不推荐仅依赖 stub_status:它只返回全局汇总值(如
Active connections: 291),无进程维度,Prometheus 无法拆分监控
验证指标是否真正按 worker 区分
部署好 Exporter 后,直接访问 http://<exporter-host>:9113/metrics,搜索 nginx_worker_connections_active:
- 正确结果示例:
nginx_worker_connections_active{pool="default",pid="12345"} 87和nginx_worker_connections_active{pool="default",pid="12346"} 92—— 两条以上、pid值不同 - 若只看到无
pid标签的单条指标(如nginx_connections_active 291),说明未启用 worker 级采集,需回查 vts 配置或 Exporter 版本
在 Prometheus 中聚合与告警
有了带 pid 的指标,就能做真正的 per-worker 分析:
- 查看各 worker 负载是否均衡:
avg by (pid) (nginx_worker_connections_active)对比最大值与平均值,偏差超 30% 可能存在调度不均 - 检测异常退出的 worker:
count(count by (pid) (nginx_worker_connections_active)) < count by (instance) (nginx_info)—— 若活跃 pid 数少于预期 worker 数,说明有进程已挂但主进程未重启 - 设置单 worker 连接过载告警:
nginx_worker_connections_active > 0.9 * nginx_worker_connections_limit,配合for: 2m避免毛刺误报
配套 Nginx 配置要点
确保底层 Nginx 支持并暴露所需数据:
-
worker_processes auto;或明确设为 CPU 核心数,避免人为设为 1 而失去多 worker 监控意义 - vts 模块配置中必须开启
vhost_traffic_status_zone和vhost_traffic_status_display_format json - Exporter 启动命令需指向 vts 的 JSON 接口:
--nginx.scrape-uri=http://localhost/status/format/json,不能指向/nginx_status


















