nginx通过host头、请求头/参数、路径前缀三种方式实现多租户隔离:1. 基于host的子域名路由,支持独立server块或map动态映射;2. 基于x-tenant-id等header或tenant参数,配合map与proxy_pass动态转发,并建议白名单校验;3. 路径前缀隔离需location匹配并重写路径,透传租户信息;同时需为各upstream独立配置连接池、超时、健康检查,记录租户级日志,并按租户限流。

在 Nginx 中通过代理映射实现后端集群的多租户隔离,核心是利用请求特征(如 Host、Header、路径前缀等)将不同租户流量精准路由到对应后端服务实例或集群,避免共享资源导致的数据越界或配置冲突。
基于 Host 头做租户路由
这是最常用也最直观的方式。每个租户拥有独立子域名(如 tenant-a.example.com、tenant-b.example.com),Nginx 根据 server_name 或 $host 变量匹配并转发到对应 upstream。
- 为每个租户定义独立
server块,配合专属 upstream,完全隔离配置和连接池 - 也可统一
server块,用map指令动态映射 upstream 名称,便于集中维护 - 注意通配符 server_name(如
*.example.com)需配合map使用,避免 fallback 到默认 server
利用请求头或参数识别租户
适合 API 网关场景,租户标识不体现在域名中,而是通过自定义 Header(如 X-Tenant-ID)或查询参数(如 ?tenant=abc)传递。
- 用
map指令将 Header 或参数值映射为 upstream 名称或后端地址 - 配合
proxy_pass http://$upstream_name实现动态代理,避免硬编码 location - 建议对租户 ID 做白名单校验(可用
if + return 403或 Lua 模块),防止伪造绕过
路径前缀隔离(Path-based Tenancy)
租户共用同一域名,通过 URL 路径区分,如 /tenant-a/api/... 和 /tenant-b/api/...。
- 使用
location ^~ /tenant-a/拦截并重写路径(proxy_rewrite或proxy_pass末尾带斜杠)再转发 - 注意路径重写时剥离租户前缀,避免后端收到冗余路径;例如
proxy_pass http://backend/;会自动截掉匹配的前缀 - 若后端需感知租户信息,可通过
proxy_set_header X-Tenant-ID $1(配合正则捕获)透传
安全与运维要点
多租户隔离不仅是路由问题,更涉及资源、日志、限流和可观测性。
- 每个 upstream 应独立配置连接数、超时、健康检查,防止某租户故障影响全局
- 开启
log_format记录$host、$http_x_tenant_id、$upstream_addr,便于按租户分析访问和错误 - 结合
limit_req按租户维度限流(用zone关联租户标识变量),防止单租户打爆集群











