Nginx中多站点不推荐共用同一root目录,因root指令在server块内仅能出现一次且优先级最高;确需共享物理路径时,应通过alias映射子路径、多server块指向不同子目录或map动态设置root来实现逻辑隔离。

多站点共用根目录在 Nginx 中并不推荐,因为 root 指令本质是为每个 server 或 location 定义静态文件的“基础路径”,而多个独立站点通常需要隔离资源、避免路由冲突和权限混杂。但若确需共享同一物理根目录(例如统一存放前端构建产物、或做灰度/版本切换),关键不是“共用 root”,而是通过合理结构设计 + location 分流来实现逻辑隔离。
root 只能设一次,不能跨 server 复用
一个 server 块内,root 指令只能出现一次,且优先级高于 location 内部的 root(location 里的 root 实际无效)。所以:
- 不能在同一个 server 里为 /site1 和 /site2 各配一个 root
- 不能写成:location /site1 { root /var/www/shared; } —— 这行不生效
- 真正有效的 root 必须放在 server 块顶层或 location / {} 中
方案一:用 alias + 子路径映射(适合同域名下多应用)
比如 host.com/site1 → 映射到 /var/www/apps/site1,host.com/site2 → 映射到 /var/www/apps/site2,所有应用都放在 /var/www/apps 下,但对外路径隔离:
- location ^~/site1/ { alias /var/www/apps/site1/; index index.html; try_files $uri $uri/ /site1/index.html; }
- location ^~/site2/ { alias /var/www/apps/site2/; index index.html; try_files $uri $uri/ /site2/index.html; }
- 注意 alias 路径末尾必须带 /,且匹配路径(如 /site1/)会从 URI 中剥离,只拼接剩余部分
方案二:用不同 server 块 + 同一物理目录(适合多域名)
如果 site1.com 和 site2.com 都指向 /var/www/shared,但各自完全独立,可这样配置:
- server { listen 80; server_name site1.com; root /var/www/shared/site1; index index.html; try_files $uri $uri/ /index.html; }
- server { listen 80; server_name site2.com; root /var/www/shared/site2; index index.html; try_files $uri $uri/ /index.html; }
- 虽然物理路径都在 /var/www/shared 下,但每个 server 的 root 指向其子目录,互不影响
方案三:用 map + 动态 root(高级但灵活)
适用于按请求头、参数或子域名动态决定根目录(如 zh.example.com → /var/www/zh,en.example.com → /var/www/en):
- 在 http 块中定义 map:
map $host $app_root {
zh.example.com "/var/www/zh";
en.example.com "/var/www/en";
default "/var/www/default";
} - 在 server 块中使用:
root $app_root;
实际部署时,建议优先用方案一(alias)或方案二(多 server),结构清晰、调试简单。共用根目录本身不是问题,问题在于如何让不同入口正确找到自己的 index.html 和静态资源——核心靠路径映射逻辑,而不是靠 root 指令堆叠。


















