最精准做法是在状态监控页面的location块内配置deny规则,仅允许指定IP访问/nginx-status路径,用geo模块或include外部文件管理黑名单,修改后需nginx -t验证再reload。

直接在状态监控页面所在的 location 块里加 deny 规则,是最精准、最常用的做法。不建议全局封禁,否则会影响正常业务。
只针对 status 页面做限制
假设你用的是 stub_status 模块(Nginx 自带),配置类似这样:
location /nginx-status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 192.168.10.0/24;
deny all;
}这段配置表示:仅允许本地回环和内网某网段访问 /nginx-status,其他所有 IP 请求都会返回 403。
-
顺序很重要:
allow和deny按书写顺序逐条匹配,第一条命中即生效;deny all必须放在最后 -
不能只写 deny:如果只写
deny 203.201.10.5;而没写allow all;,其余 IP 默认仍可访问——除非你明确想“只拦个别 IP,其余全放行” -
路径要严格对应:比如你把监控页设为
/status,那规则就得写在location /status { ... }里,而不是/nginx-status
用 geo 模块管理多个黑名单 IP
当要屏蔽的 IP 较多(比如几十个恶意采集源),硬编码 deny 行会难维护。推荐用 geo 模块提前标记:
http {
geo $bad_ip {
default 0;
203.201.10.5 1;
185.143.22.12 1;
2a02:8071:abcd::1 1; # 支持 IPv6
}
<pre class="brush:php;toolbar:false;">server {
location /nginx-status {
if ($bad_ip) {
return 403;
}
stub_status on;
access_log off;
}
}}
好处是逻辑清晰、支持 IPv6、便于批量更新,且不影响其他 location 的访问控制逻辑。
配合 include 外部文件,便于运维协作
把黑名单单独存成文件,比如 /etc/nginx/conf.d/blacklist.conf:
deny 203.201.10.5; deny 185.143.22.12; deny 2a02:8071:abcd::1;
然后在对应 location 中引入:
location /nginx-status {
include /etc/nginx/conf.d/blacklist.conf;
allow 127.0.0.1;
allow 192.168.10.0/24;
deny all;
stub_status on;
access_log off;
}这样安全团队可以独立维护黑名单文件,无需每次修改主配置,也避免误操作影响整体服务。
验证与生效要点
改完配置别直接 reload,先做三步确认:
- 运行
nginx -t检查语法是否正确 - 确认目标 IP 当前能否访问(可用
curl -x "" http://your-domain/nginx-status测试) - 执行
nginx -s reload生效,不要用 restart(避免连接中断)
注意:stub_status 页面本身不鉴权,纯靠 IP 控制;如需更高安全性,可叠加 HTTP Basic Auth 或反向代理层身份校验。


















