Stub-Status模块默认未编译进Nginx,需通过nginx -V | grep with-http_stub_status_module确认;若无输出则必须重新编译并添加--with-http_stub_status_module参数,不可动态加载。

确认 stub_status 模块是否已编译进 Nginx
直接运行 nginx -V(大写 V),然后 grep 检查输出里有没有 --with-http_stub_status_module:
nginx -V 2>&1 | grep -o with-http_stub_status_module
如果没输出,说明模块未启用——不能靠配置开启,必须重新编译。YUM/Apt 安装的主流发行版(如 CentOS Stream 9、Ubuntu 24.04)通常默认包含该模块;但自编译或某些精简镜像可能缺失。
- 缺失时需下载源码,用
./configure --with-http_stub_status_module重新编译安装 - 别试图在配置里加
load_module加载 stub_status —— 它不是动态模块,不支持 runtime 加载 -
nginx -t不会报 stub_status 不存在的错,但 reload 后访问路径会返回 404 或 500
在 location 块中启用 stub_status
stub_status 只能在 server 或 location 上下文中使用,不能放在 http 或 upstream 块里。最简可用配置如下:
location /nginx_status {
stub_status;
access_log off;
allow 127.0.0.1;
deny all;
}
注意几个关键点:
-
stub_status没有 on/off 参数,写成stub_status on;是语法错误(Nginx 1.19+ 会拒绝加载) - 路径名任意,但不要用
/status这类通用名——容易和第三方模块(如ngx_http_upstream_check_module的check_status)冲突 -
access_log off;强烈建议加上,否则每秒刷一条日志,磁盘 I/O 和日志轮转压力不小 - 必须配
allow/deny控制访问,否则暴露服务器内部指标属于安全风险
验证返回内容是否符合预期
执行 curl http://127.0.0.1/nginx_status,正确响应是纯文本,格式固定:
Active connections: 3 server accepts handled requests 12345 12345 67890 Reading: 0 Writing: 1 Waiting: 2
常见异常现象:
- 返回 404:location 路径没匹配上,检查是否拼错(比如写成
/nginx_statu),或 server 块监听地址/端口不对 - 返回 403:IP 不在
allow列表里,或deny all写在了allow前面(顺序敏感) - 返回空白或 HTML:
stub_status被误写在upstream块里,或 Nginx 版本太老( - 字段对不齐:用
awk解析时别依赖空格数,改用正则或字段索引(如awk 'NR==3 {print $2,$4,$6}')
用脚本安全提取指标并避免解析失效
stub_status 输出格式稳定但无结构化,直接用 grep/awk 提取要小心换行和空格变化。推荐做法:
- 用
curl -s避免进度条干扰,加-f让失败时返回非零退出码 - 提取
Active connections用:awk '/Active connections:/ {print $3}' - 提取三元组(accepts/handled/requests)用:
awk 'NR==3 {print $1,$2,$3}'(固定第三行) - 不要用
sed 's/^[[:space:]]*//'去首空格——新版 Nginx 输出开头无空格,反而可能误删数字 - 监控脚本里加超时:
curl -m 2 http://127.0.0.1/nginx_status,防卡死
stub_status 是单机维度指标,不反映 upstream 节点健康状态;真要查后端存活,得用 ngx_http_upstream_check_module 或 Prometheus + nginx-vts-exporter。


















