为每个租户配置独立 server 块,绑定唯一子域名(如 tenant-a.example.com),精确匹配、禁用通配符;通过 map 提取并校验租户 ID,非法请求返回 400;透传 X-Tenant-ID、定制日志与响应头;缓存、gzip、限流、上游均物理隔离。

用独立 server 块为每个租户分配专属子域名,是最直接、最可靠的方式。它天然支持 TLS 证书分离、日志隔离、限流独立和故障不扩散,不需要依赖复杂的条件判断或共享配置兜底。
每个租户一个 server 块,绑定唯一子域名
为 tenant-a.example.com 和 tenant-b.example.com 分别写两个 server 块,不能合并或 fallback 到默认块:
-
server_name tenant-a.example.com;—— 精确匹配,不带通配符更安全 -
server_name tenant-b.example.com;—— 同理,避免用*.example.com导致意外命中 - 确保 DNS 已将这两个域名解析到同一台 Nginx 服务器 IP
提取并校验租户 ID,拒绝非法请求
在 http 块中用 map 提取租户名,并做格式校验:
- 用正则捕获:
server_name ~^(?<tenant>[a-z0-9\-]+)\.example\.com$;</tenant> - 定义合法性检查:
map $tenant $valid_tenant { default 0; "~^[a-z0-9\-]{2,16}$" 1; } - 在对应
server块里拦截非法值:if ($valid_tenant = 0) { return 400; }
透传租户上下文,支撑后端与可观测性
每个 server 块内单独配置,不复用全局设置:
- 把租户身份传给后端:
proxy_set_header X-Tenant-ID $tenant; - 记录到访问日志:
access_log /var/log/nginx/tenant-a-access.log main; - 定制响应头,便于前端或监控识别:
add_header X-Tenant-Name "tenant-a";
配套策略全部按租户物理隔离
缓存、压缩、限流、上游服务都不能共用,必须一对一绑定:
- 缓存:每个租户独立
proxy_cache_path+proxy_cache tenant_a;+ 含$tenant的proxy_cache_key - Gzip:在各自
server块中启用gzip on;,并按需设gzip_types和gzip_min_length - 限流:
limit_req_zone $binary_remote_addr zone=tenant_a:10m rate=100r/m;,再在对应块中调用 - 上游服务:
upstream tenant_a_backend { server 10.0.1.10:8080; },绝不和其他租户混用


















