nginx实现多租户静态文件服务需融合隔离与共用逻辑:①按子域名或路径前缀为各租户配置独立root/alias及文件系统权限;②差异化设置expires、gzip_types和cache-control;③通过自定义日志、独立access_log及x-served-by-tenant头透传租户上下文;④禁用autoindex、用try_files+404、敏感路径403及limit_req限流强化安全。

要让 Nginx 同时做好静态文件服务和多租户隔离,关键不是“二选一”,而是把两类配置融合进同一套逻辑:每个租户的静态资源路径、缓存策略、限流规则、日志归属都彼此独立,互不干扰。
按租户划分静态资源根目录
不能所有租户共用一个 root 路径。应为每个租户配置专属 server 块,并在其中用 root 或 alias 指向隔离的文件系统路径:
- 子域名方式(推荐):tenant-a.example.com → root /var/www/tenant-a/static;
- 路径前缀方式:/t/a/static/ → location ^~ /t/a/static/ { alias /var/www/tenant-a/static/; }
- 确保底层文件系统权限严格隔离,例如租户 A 的目录仅对 nginx worker 进程中指定用户可读
租户级缓存与压缩策略
不同租户的静态资源更新节奏可能不同,缓存时间需差异化设置:
- 在对应 server 或 location 块内单独配置 expires,例如 tenant-b 的 JS/CSS 缓存 1 年,而 tenant-c 的 HTML 禁用缓存
- Gzip 压缩启用全局,但可结合 gzip_types 按租户微调,比如对 tenant-d 的 SVG 资源额外启用压缩
- 用 add_header Cache-Control 注入带租户标识的策略,如 "public, immutable, tenant-id=a"
静态资源访问的租户上下文透传
即使不走后端,Nginx 也需在日志和响应头中显性携带租户身份,便于审计与问题定位:
- 自定义日志格式固定包含租户字段:$tenant 或 $http_x_tenant_id
- 每个 server 块使用独立 access_log 路径,例如 /var/log/nginx/tenant-a-static.log
- 响应头注入租户信息:add_header X-Served-By-Tenant "a";
- 若通过 header 或路径识别租户,必须前置校验合法性,非法值直接 return 403,不进入静态服务流程
防止跨租户资源越权访问
静态服务天然易被路径遍历或猜解攻击利用,需主动防御:
- 禁用 autoindex on,避免目录列表泄露结构
- 用 try_files $uri =404 显式终止未命中路径,不 fallback 到默认 server
- 对敏感路径(如 /t/a/.git/ 或 /t/b/config/)用 location 匹配并 return 403
- 结合 limit_req 对静态资源接口限流,例如单租户每分钟最多请求 200 次图片资源











