Nginx不支持单location配多个root,多租户应通过独立server块(子域名)或alias(路径前缀)实现隔离;需严格配置权限、禁用autoindex、拦截敏感路径,并避免在location内滥用root。

Nginx 的 root 指令本身不支持“一个 location 下配多个 root”,也不支持动态切换;多租户场景下,关键不是硬塞多个 root,而是通过结构化配置实现租户资源的逻辑隔离和物理分离。
按租户划分独立 server 块(子域名方式)
这是最清晰、最安全的做法。每个租户对应一个 server,用 server_name 匹配子域名,并在内部用 root 指向专属目录:
- 租户 A:
a.example.com→root /var/www/tenant-a/dist; - 租户 B:
b.example.com→root /var/www/tenant-b/dist; - 所有
server块共用同一份基础配置(如 gzip、日志格式),但root、access_log、error_log各自独立。
路径前缀方式用 alias 替代 root
如果必须共用一个域名(如 example.com/a/、example.com/b/),就不能依赖 root —— 因为 root 在嵌套 location 中不生效,且拼接逻辑易出错。应改用 alias:
-
location ^~ /a/ { alias /var/www/tenant-a/dist/; index index.html; try_files $uri $uri/ /a/index.html; } -
location ^~ /b/ { alias /var/www/tenant-b/dist/; index index.html; try_files $uri $uri/ /b/index.html; }
⚠ 注意:alias结尾必须加/,且路径末尾斜杠要与location严格匹配,否则文件定位失败。
文件系统权限与路径安全必须同步落实
- 每个租户目录归属独立系统用户(如
tenant-a:nginx),并设为750权限; - 禁用
autoindex on; - 敏感路径(如
/etc/、/var/log/)用location ~ ^/(etc|var/log) { return 403; }主动拦截; - 配合
try_files防止路由穿透,避免越界访问其他租户资源。
不要在同一个 server 块里反复写 rootroot 是继承性指令,写在 server 块顶层只对未被 location 覆盖的请求生效;写在 location 内部基本无效(除非是 location / {})。强行堆砌只会导致行为不可预测,比如 /a/static/js/app.js 实际去查 /var/www/dist/a/static/js/app.js 而非租户 A 的根目录。
不复杂但容易忽略


















