必须通过shell脚本解析stub_status文本为Prometheus格式:提取Active、Reading、Writing、Waiting连接数,写入textfile目录供node_exporter采集,并在Prometheus中基于nginx_stub_*指标设置告警与性能分析。

直接用 Prometheus 抓取 stub_status 原始页面不行,因为它返回的是固定格式纯文本,不是指标格式。必须加一层轻量解析,把关键数字转成 Prometheus 可识别的 key-value 格式。
确认 stub_status 已安全启用
先确保 Nginx 确实启用了该模块并暴露了受控接口:
- 执行 nginx -V 2>&1 | grep with-http_stub_status_module,有输出才代表模块可用
- 在 server 块中配置类似以下内容(路径建议避开 /status,如用 /_nxs):
location /_nxs {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
} - 重载配置:nginx -s reload,再用 curl -s http://127.0.0.1/_nxs 验证返回是否为三行文本,含 Active connections 字样
提取核心并发状态字段
stub_status 输出结构稳定,但字段位置固定、空格不规范,推荐用正则提取而非按空格切分:
-
Active connections:匹配
Active connections: (\d+)→ 表示当前所有 TCP 连接总数 -
Reading / Writing / Waiting:分别匹配
Reading: (\d+)、Writing: (\d+)、Waiting: (\d+) - 注意:Waiting = Active − Reading − Writing,可交叉验证数据一致性
转成 Prometheus 文本格式并落地
Prometheus 支持 textfile collector,把指标写入 .prom 文件即可自动采集:
- 写一个 shell 脚本(例如 /usr/local/bin/nginx-stub-collect.sh),每 10 秒执行一次:
curl -s http://127.0.0.1/_nxs | awk '/Active connections/ { gsub(/[^0-9]/,"",$3); print "nginx_stub_active_connections " $3 } /Reading:/ { gsub(/[^0-9]/,"",$2); print "nginx_stub_reading_connections " $2 } /Writing:/ { gsub(/[^0-9]/,"",$2); print "nginx_stub_writing_connections " $2 } /Waiting:/ { gsub(/[^0-9]/,"",$2); print "nginx_stub_waiting_connections " $2 }' > /var/lib/node_exporter/textfile/nginx.prom - 确保 node_exporter 启动时带参数:--collector.textfile.directory=/var/lib/node_exporter/textfile
- 脚本需有执行权限,并用 systemd 或 cron 稳定运行(推荐 systemd timer)
在 Prometheus 中使用这些指标
采集成功后,指标名会自动带上前缀,例如:
- nginx_stub_active_connections:总连接水位,适合设告警阈值(如 > 1000 持续 5 分钟)
- nginx_stub_writing_connections:反映响应瓶颈,若长期高于平均值,检查后端延迟或网络吞吐
- nginx_stub_waiting_connections / nginx_stub_active_connections > 0.8 是健康信号,说明 keepalive 利用充分











