Nginx多租户路由隔离需从请求入口按租户身份划清边界:优先按唯一子域名识别并校验合法性,非法请求返回400;为每个租户配置独立upstream池与限流、日志、响应头等策略,确保物理隔离与故障隔离。
要解决 Nginx 负载均衡器在多租户环境下的路由隔离,关键不是让所有租户“走同一条路再靠后端区分”,而是从请求进入的第一刻起,就按租户身份划清边界——识别要准、路由要专、策略要独。
按域名做租户识别与路由隔离
这是最清晰、最易维护的方式。每个租户分配唯一子域名(如 tenant-a.api.example.com),Nginx 用正则 server_name 提取租户名,并立即校验合法性:
http 块中定义:server_name ~^(?<tenant>[a-z0-9-]+).api.example.com$; map 检查格式:只允许小写字母、数字、短横线,长度 3–16 位;非法值直接 return 400 X-Tenant-ID 头,且仅绑定到其专属 server 块内 这样,不同租户的请求天然落在不同 server 上,后续配置(如 upstream、限流、日志)完全独立,互不干扰。
为每个租户配置专属 upstream 池
绝不能让多个租户共用同一个 upstream。否则一个租户的后端故障或高负载,会拖垮其他租户:
upstream tenant_a_backend { server 10.0.1.10:8080; server 10.0.1.11:8080; } least_conn 或 ip_hash,确保同一租户流量稳定落在其授权节点上 max_fails=2 fail_timeout=30s,故障只剔除本租户池内节点,不影响他人 路径前缀或请求头方式需兜底校验
若必须共用主域名(如 api.example.com),可用路径前缀(如 /t/a/)或 X-Tenant-ID 头识别,但必须补足安全闭环:
location ^~ /t/a/ { rewrite ^/t/a/(.*)$ /$1 break; proxy_pass http://tenant_a_backend; } map 预定义合法租户映射,未匹配项统一 return 400,不 fallback 到默认后端 租户级策略必须物理分离
路由隔离只是起点,真正防干扰靠的是运行时策略独立:
limit_req_zone $binary_remote_addr zone=tenant_a:10m rate=50r/m;,再在对应 server 中调用 access_log /var/log/nginx/tenant-a-access.log tenant_log;,log_format 包含 $http_x_tenant_id add_header X-Tenant-Name "tenant-a";,CSP 等安全头也可差异化配置 不复杂但容易忽略