nginx访问控制需在location或server块中使用allow/deny指令,按顺序匹配,deny all须置末;支持ip、cidr、ipv6(方括号),可结合geo+map实现区域限制,配置后须nginx -t验证并reload。

安装 Nginx 后,默认不启用任何访问控制,所有请求都能到达服务器。要实现基本的安全访问控制,核心是使用 allow 和 deny 指令配合 deny all 构建白名单或黑名单策略,同时注意作用域和匹配顺序。
明确配置位置:location 或 server 块中生效
访问控制指令必须放在 location、server 或 http 块内,不能单独写在配置文件顶层。常用做法是在具体路径下限制,例如仅允许内网访问后台接口:
- 在
location /admin块中配置,比放在server块更精准,不影响其他路径 - 若需全局限制(如只允许某几个 IP 访问整个站点),可放在
server块里 - 多个
allow/deny规则按书写顺序自上而下匹配,遇到第一条匹配即停止(类似防火墙规则)
设置 IP 白名单:只允许可信地址访问
适用于管理后台、API 调试接口等敏感路径。例如只允许公司内网(192.168.1.0/24)和运维人员固定公网 IP(203.0.113.5)访问 /api/internal:
location /api/internal {
allow 192.168.1.0/24;
allow 203.0.113.5;
deny all;
}
-
allow和deny可接受单个 IP、CIDR 网段、all关键字 -
deny all必须放在最后,否则前面的allow不生效 - IPv6 地址需用方括号包裹,如
allow 2001:db8::/32
结合 geo 模块做区域级限制(可选进阶)
如果需要按国家或地区屏蔽流量,Nginx 自带 geo 模块可预定义变量,再通过 map 或 if 配合 deny 实现。但注意:if 在 location 中有局限,推荐用 geo + map 方式:
geo $bad_country {
default 0;
192.0.2.0/24 1; # 示例:屏蔽某测试网段
203.0.113.0/24 1;
}
<p>map $bad_country $limit {
1 "deny";
0 "";
}</p><p>server {
location / {
if ($limit = "deny") {
return 403;
}</p><h1>正常代理或静态服务</h1><pre class="brush:php;toolbar:false;"><code>}</code>}
- 直接在
location中用deny不支持变量,所以需借助return 403替代 - 真实地理 IP 库需第三方模块(如 ngx_http_geoip2_module)配合 MaxMind 数据库
- 简单场景建议优先用静态 IP 列表,避免过度依赖外部数据源
验证与调试要点
配置完成后必须重载 Nginx 并测试效果,避免锁死自己:
- 执行
nginx -t检查语法,确认无误再nginx -s reload - 从被允许和被拒绝的 IP 分别发起请求(如用
curl -I http://yoursite/admin),观察返回状态码是否为 200 或 403 - 查看错误日志
/var/log/nginx/error.log,Nginx 会记录“client denied by rule”类提示 - 若使用云服务器,还需检查安全组/防火墙是否放行对应端口,避免网络层拦截早于 Nginx











