Nginx 多域名独立根目录应使用多个 server 块,每个块中用 root 指令指定专属路径;alias 仅适用于 location 内子路径映射,不可替代 root 配置全站根目录。

Nginx 为多个域名配置独立根目录,核心是用 server 块隔离域名,并在每个块中用 root 指令指定专属路径。alias 不适合用于整个域名的根目录配置,它专用于 location 内部的路径映射,不能替代 root 在 server 或 location / 场景下的作用。
一、用 root 配置多域名独立根目录(推荐方式)
每个域名对应一个 server 块,root 放在 server 或 location / 中均可,但放在 server 级最清晰、最常用。
server {
listen 80;
server_name example1.com www.example1.com;
root /var/www/example1.com;
index index.html;
}
server {
listen 80;
server_name example2.com www.example2.com;
root /var/www/example2.com;
index index.html;
}-
root的作用:把请求中的域名+端口部分,整体替换为该路径
例如访问http://example1.com/css/app.css→ 实际读取/var/www/example1.com/css/app.css - 每个
server块完全独立,互不干扰 - 确保各目录存在、权限正确(如
nginx用户可读)
二、为什么不用 alias 配置整个域名?
alias 只能在 location 块中使用,且逻辑是“替换匹配路径”,不是“设定网站根”。若强行用于全站:
# ❌ 错误写法(语法报错)
server {
listen 80;
server_name example.com;
alias /var/www/example.com; # 报错:alias 不允许出现在 server 级
}即使绕到 location /:
# ⚠️ 不推荐,语义混乱且易出错
location / {
alias /var/www/example.com/;
}问题在于:
-
alias /path/要求结尾带/,否则http://example.com/test.js会变成/var/www/example.comtest.js -
alias会把/完全替换掉,导致index文件查找异常(比如index.html不会被自动补全) - 它本意是做子路径映射(如
/static/ → /data/static/),不是替代root
所以:多域名独立根目录必须用 root,不要用 alias
三、常见搭配技巧
-
HTTPS 域名共存:同一
server_name可同时监听 80 和 443,并启用 SSL -
通配子域名支持:
server_name ~^(?<sub>.+)\.example\.com$; root /var/www/example.com/$sub;
配合
map或变量拼接实现动态路径(需开启ngx_http_map_module) -
配置分离管理:在
http块中include vhost/*.conf;,每个域名一个.conf文件,便于维护
四、验证与调试要点
- 修改后运行
nginx -t检查语法 - 重启或重载:
nginx -s reload - 查看错误日志(通常
/var/log/nginx/error.log)定位 403/404 - 注意目录权限:
chown -R www-data:www-data /var/www/example1.com(Debian/Ubuntu)或nginx:nginx(CentOS/RHEL) - 浏览器访问时确认 Host 请求头是否匹配
server_name(尤其本地 hosts 测试时)
不复杂但容易忽略。


















