nginx中为单个虚拟主机启用ip黑名单需在对应server块内按“deny ip; ... allow all;”顺序配置,白名单则用“allow ip; ... deny all;”,关闭限制即不写任何allow/deny指令或用allow all;覆盖。

在 Nginx 的 server 块中为特定虚拟主机启用或禁用 IP 黑名单,核心是把控制逻辑写在对应域名的 server 块内,而不是全局或共用 location 中。它不依赖开关式配置项,而是通过 allow/deny 指令组合实现“开启”或“关闭”效果。
为单个虚拟主机启用黑名单(禁止指定 IP)
适用于屏蔽已知恶意源、扫描段等场景。关键在于“先拒绝,再放行全部”,顺序不能颠倒:
- 在目标
server块的location或直接在server级别写deny规则 - 每条
deny后跟具体 IP 或 CIDR 网段,例如deny 198.51.100.0/24; - 最后必须加
allow all;,否则所有请求都会被默认拒绝
示例(仅对 admin.example.com 生效):
listen 80;
server_name admin.example.com;
root /var/www/admin;
location / {
deny 203.0.113.5;
deny 198.51.100.12;
allow all;
}
}
为单个虚拟主机启用白名单(只允许指定 IP)
本质是“黑名单的反向逻辑”,即只放行特定来源,其余一律拦截。这相当于对该站点开启了严格访问控制:
- 先写多个
allow,支持 IPv4/IPv6 和 CIDR(如allow 2001:db8::/32;) - 所有
allow写完后,必须紧跟deny all; - 没有
deny all,未匹配的请求会默认放行,失去控制意义
示例(仅允许公司内网和运维主机访问后台):
listen 443 ssl;
server_name api.example.com;
ssl_certificate ...;
location / {
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 203.0.113.10;
deny all;
}
}
让某个虚拟主机完全绕过 IP 限制(即“关闭”黑名单)
所谓“关闭”,就是不写任何 allow/deny 指令,或显式取消限制逻辑:
- 最简单方式:不在该
server块中添加任何访问控制指令 - 若已有通用规则被 include 进来,可用
allow all;覆盖(放在最前) - 避免在
http或上级块误配deny all,否则会影响所有站点
注意:Nginx 没有 ip_blacklist on/off 这类开关指令,所谓开启或关闭,全靠是否写入及如何组织 allow/deny。
进阶:用 geo + if 实现可复用的黑名单开关
适合多站点共用同一套黑名单,但又想按需启用或禁用:
- 在
http块定义geo变量,例如标记被封 IP:geo $is_blocked { default 0; 192.168.1.100 1; } - 在需要启用黑名单的
server块中,用if ($is_blocked) { return 403; } - 在不需要限制的站点里,跳过这条
if判断即可——等于“关闭”该黑名单
这种方式便于集中维护 IP 列表,也方便通过注释或条件判断快速启停某站点的限制逻辑。











