每个虚拟主机(server块)应单独配置root,这是最直接安全的做法;Nginx不允许多站点共用同一root指令,但支持为每个server块独立指定物理路径实现天然隔离,推荐按域名或端口分别配置root,同域名下多子路径则应使用alias而非多个root。

每个虚拟主机(server 块)单独配一个 root,是最直接、最安全的做法。Nginx 本身不允许多个站点共用同一个 root 指令,但支持为每个 server 块独立指定物理路径,天然隔离,互不影响。
按域名配置不同 root(推荐)
这是最常见的多站点部署方式。通过 server_name 匹配域名,再用 root 指向各自专属目录:
- server { listen 80; server_name zh.example.com; root /var/www/zh; index index.html; }
- server { listen 80; server_name en.example.com; root /var/www/en; index index.html; }
- server { listen 443 ssl; server_name api.example.com; root /var/www/api; }
请求 /about.html 时,Nginx 自动拼成 /var/www/zh/about.html 或 /var/www/en/about.html,无需额外处理路径逻辑。
按端口配置不同 root
当不依赖域名(比如内网调试或服务隔离),可用端口区分虚拟主机:
- server { listen 8080; root /var/www/app-a; index index-a.html; }
- server { listen 8081; root /var/www/app-b; index dashboard.php; }
- server { listen 8082; root /var/www/docs; index index.md; }
注意:每个 listen 端口必须唯一;root 路径建议用绝对路径,避免因工作目录变化导致定位失败。
同域名下多个子路径映射不同目录(用 alias 更合适)
如果想在 example.com/site1/ 和 example.com/site2/ 下分别托管两个应用,不建议在同一个 server 里反复改 root——因为 root 在 server 块中只能出现一次,且 location 内的 root 实际无效。
此时应改用 alias,它会剥离匹配路径,只拼接剩余部分:
- 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 路径末尾必须带 /;URI 中的 /site1/ 会被完全去掉,请求 /site1/css/app.css 就查 /var/www/apps/site1/css/app.css。
避免常见错误
- 不要在同一个 server 块里写多个 root——语法允许但只有第一个生效
- location 中写 root 容易引发路径多拼一层(比如请求
/blog/却去找/var/www/html/blog/blog/),优先用 alias 处理子路径 - 确保目标目录存在且 Nginx 进程有读取权限,否则返回 403 或 404
- 修改后务必运行
nginx -t测试语法,再systemctl reload nginx


















