Nginx stub_status需安全启用:绑定本地端口、禁用日志、IP白名单、非敏感路径;Prometheus采集需textfile中转转为指标格式;人工查看须经反向代理+Basic Auth加固。

想用 Nginx 自带的 stub_status 模块做网关监控?关键不是“能不能开”,而是“怎么开得安全、稳定、可采集”。它只提供极简的连接数和请求统计,本身不输出 JSON、不带标签、不支持认证,直接暴露在公网等于把网关心跳裸奔——必须配合反向代理、访问控制和指标转换才能真正落地。
启用 stub_status 的最小安全配置
不能只写 location /status { stub_status; } 就完事。Nginx 默认允许任意 IP 访问该接口,生产环境必须限制来源并避免路径冲突:
- 用独立 server 块监听本地端口(如 127.0.0.1:8081),不走公网监听端口
- 显式关闭日志记录:
access_log off;,避免状态页被高频刷日志 - 加
allow 127.0.0.1;和deny all;,禁止外部直连 - 路径避开常见敏感词(如 /status、/nginx_status),改用 /_nxs(nxs = nginx stub)更稳妥
用 Prometheus Node Exporter 的 textfile 收集器中转
stub_status 返回的是纯文本(Active connections: 123...),Prometheus 原生不识别。推荐用轻量级中转:每 10 秒用 curl 抓取一次,转成 Prometheus 格式写入 textfile 目录:
- 写一个 shell 脚本调用
curl -s http://127.0.0.1:8081/_nxs - 用 awk 提取
Active connections、accepts、handled、requests四个关键值 - 格式化为:
nginx_stub_active_connections 123等指标行,追加到/var/lib/node_exporter/textfile/nginx.prom - 确保 node_exporter 启动时加了
--collector.textfile.directory=/var/lib/node_exporter/textfile
通过 Nginx 反向代理统一出口并加 Basic Auth
如果团队需要人工临时查看,或 Grafana 需要直连(不推荐但有时绕不开),必须走反向代理层加固:
- 新建一个仅限内网访问的 server,例如 listen 10.10.10.10:80;location /metrics { proxy_pass http://127.0.0.1:8081/_nxs; }
- 加上
auth_basic "Nginx Status"; auth_basic_user_file /etc/nginx/.htpasswd; - 用
htpasswd -c /etc/nginx/.htpasswd monitor创建只读账号 - 同时加
proxy_hide_header Connection;和proxy_set_header Host $host;,避免后端响应头干扰
识别并规避常见陷阱
很多故障不是配置错,而是没意识到模块行为边界:
-
stub_status统计的是当前 worker 进程的数据,多 worker 时需确认是否开启accept_mutex off或用nginx -T查看实际生效的配置 - 返回的
handled不等于accepts:当连接被拒绝(如超出 worker_connections)、或 SSL 握手失败时,accepts 会增,handled 不增 - 若用 OpenResty,可用
lua-resty-prometheus替代 stub_status,直接暴露标准指标,但需额外维护 Lua 模块 - 不要把 stub_status 和 access_log combined 日志混为一谈——前者是连接维度概览,后者才是真实请求明细,监控必须两者结合
不复杂但容易忽略。stub_status 是把快刀,削得准的前提是握稳手、避开指头。

















