安全暴露nginx监控页面须同时启用stub_status模块并配置ip白名单:先在location中设stub_status on和access_log off,再按顺序写allow规则(含127.0.0.1、::1及运维网段),最后以deny all兜底,https需在对应server块中重复配置。

要安全地暴露 Nginx 的监控页面(如 /nginx_status 或 /status),必须同时完成两件事:启用状态模块,并用 IP 白名单严格限制访问来源。缺一不可,否则敏感运行指标可能被任意用户读取。
确认并启用 stub_status 模块
Nginx 必须编译时包含 ngx_http_stub_status_module,多数官方包已默认启用。验证方式:
nginx -V 2>&1 | grep -o with-http_stub_status_module
若无输出,需重新编译安装。确认可用后,在 server 或 location 块中开启:
- 使用
stub_status on;启用状态功能 - 务必添加
access_log off;关闭日志,避免监控请求污染访问日志 - URI 路径可自定义,如
location /nginx_status { ... }或location /status { ... }
配置 IP 白名单:顺序与兜底是关键
白名单不是“加几行 allow 就完事”,而是依赖指令执行顺序和显式拒绝逻辑:
- 先写
allow规则(支持单 IP、IPv6、CIDR 网段,如allow 192.168.1.100;或allow 2001:db8::/32;) - 再写
deny all;—— 这是强制兜底,没有它,所有未匹配的 IP 默认放行 - 顺序不能颠倒:Nginx 自上而下匹配,遇到第一条满足条件的就终止判断
- 本地回环地址
127.0.0.1和::1需显式允许,否则连本机 curl 都会失败
典型安全配置示例
以下配置仅允许运维主机和本地访问,禁止其他一切来源:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow ::1;
allow 192.168.10.50; # 运维跳板机
allow 10.0.100.0/24; # 监控服务器网段
deny all;
}
注意:HTTP 和 HTTPS 的 server 块是独立的,若监听 443 端口,该 location 必须在对应 HTTPS server 内重复配置,否则 HTTPS 下的请求不受保护。
云环境特别提醒:静态白名单易失效
在 Kubernetes 或 Serverless 场景中,客户端真实 IP 可能被代理覆盖或动态变化:
- Pod IP 重启即变,硬编码
allow 10.244.1.15;很快失效 - Ingress 控制器(如 Nginx Ingress)可通过注解控制访问,例如:
nginx.ingress.kubernetes.io/server-snippet: "allow 192.168.0.0/16; deny all;" - 更稳妥的方式是结合
$realip_remote_addr或可信 header(如X-Real-IP)做转发链还原,再基于还原后的 IP 做白名单











