nginx多域名租户访问控制的核心是按域名隔离租户:每个租户独占server块、独立root路径、专属权限策略、可信x-tenant-id透传及default_server兜底拦截非法请求。

在多域名环境下用 Nginx 实现租户访问控制,核心是把“谁在访问”和“能访问什么”在请求进入的第一刻就拆开——每个域名即一个租户边界,配置不共享、策略不交叉、日志不混流。
用独立 server 块绑定租户域名
每个租户分配唯一子域名(如 tenant-a.example.com),并在 Nginx 中为它单独写一个 server 块:
- 用
server_name tenant-a.example.com;精确匹配,避免 fallback 到默认 server - 禁用通配或模糊匹配,防止非法 Host 头绕过:可加
if ($host != "tenant-a.example.com") { return 444; } - 为该块指定专属 root 路径(如
root /var/www/tenant-a;),并限制目录遍历:location / { autoindex off; }
按租户定制访问权限规则
权限不是全局开关,而是每个 server 块内独立定义:
-
IP 白名单:只放行租户授权网段,例如
allow 203.0.113.0/24; deny all; -
基础认证:对管理路径启用
auth_basic "Tenant A Admin"; auth_basic_user_file /etc/nginx/htpasswd-tenant-a; -
HTTP 方法限制:敏感接口只允许必要方法,如
limit_except GET HEAD { deny all; } -
路径级细粒度控制:例如
location /api/internal/ { deny all; }阻止租户调用内部接口
租户上下文透传与后端协同校验
前端隔离只是起点,后端必须验证 Nginx 注入的可信上下文:
- 在
server块中固定注入租户标识:proxy_set_header X-Tenant-ID "tenant-a"; - 禁止客户端伪造:不信任
X-Tenant-ID请求头,只认 Nginx 自己设的值 - 后端服务收到请求后,必须校验
X-Tenant-ID是否与当前路由匹配,不一致则拒收 - 所有拒绝行为统一记录到该租户专属 access log:
access_log /var/log/nginx/tenant-a-access.log;
兜底防护:拦截非法域名与越权尝试
没有被显式声明的域名,一律拒绝,不给任何响应机会:
- 定义一个
default_server块监听 80/443,仅用于拦截:server { listen 443 ssl default_server; return 444; } - SSL 证书使用泛域名(
*.example.com)或为每个租户单独配置,避免证书不匹配导致降级 - 对含可疑字符(如点号、下划线、路径穿越符号)的
Host头,直接return 400











