选root:当URL路径与磁盘目录结构一致时,如/static/→/var/www/static/;选alias:当需解耦URL与路径名时,如/api/docs/→/opt/swagger-ui/,且alias值末尾必须带/,location也建议以/结尾。

Nginx 的 root 和 alias 不是目录结构设计工具,但它们直接约束你必须怎么组织文件,否则 404 就会准时出现。规范化项目目录结构,核心不是“想怎么放就怎么放”,而是让路径逻辑清晰、可预期、易维护——这取决于你选 root 还是 alias,以及是否严格遵循它们的拼接规则。
root 要求:物理路径必须镜像 URL 层级
用 root 时,Nginx 把完整请求 URI(含 location 前缀)原样拼到指定目录后。这意味着:
-
/var/www/project/dist下必须真实存在web/子目录,才能支持location /web { root /var/www/project/dist; } - Vue/React 构建产物整个
dist/作为站点根,适合用location / { root /var/www/myapp/dist; }—— 此时/→dist/index.html,结构天然一致 - 若部署多个静态子站(如
/blog/,/docs/),每个都得在root目录下建同名子目录,比如/var/www/static/blog/,/var/www/static/docs/
alias 要求:物理路径与 URL 前缀解耦,但路径结尾必须规范
用 alias 是为了打破“URL 名字 = 目录名字”的绑定,但代价是更严格的书写约定:
-
alias值末尾必须加/,例如alias /opt/my-ui/;,漏掉就变成/opt/my-uiindex.html -
location最好也以/结尾(如/admin/),避免/adminfile.js这类误匹配 - 物理目录可以任意命名,比如 URL 是
/api/docs/,磁盘路径可以是/opt/swagger-ui/,完全不用在/opt/下建api/docs/
实际项目中推荐的目录结构范式
按常见部署场景划分,不追求统一,而求逻辑自洽:
-
单页应用整站部署(Vue/React/Angular)
- 文件存放:
/var/www/myapp/dist/(含index.html,assets/,js/等) - 配置用
root:location / { root /var/www/myapp/dist; try_files $uri $uri/ /index.html; } - 优势:简洁,无需额外层级,
dist/就是网站根
- 文件存放:
-
子路径挂载外部资源(如文档、管理后台、图标库)
- 文件存放:
/srv/swagger-ui/,/srv/admin-app/,/mnt/icons/(路径名与 URL 无关) - 配置用
alias:location /api/docs/ { alias /srv/swagger-ui/; } location /admin/ { alias /srv/admin-app/; } location /assets/icons/ { alias /mnt/icons/; } - 优势:隔离性强,更新某个子应用不影响其他路径,目录可放在任意挂载点
- 文件存放:
-
混合模式:主站用 root,子服务用 alias
- 主站:
/var/www/main/dist/→location / { root /var/www/main/dist; } - 第三方组件:
/var/lib/ckeditor/→location /static/ckeditor/ { alias /var/lib/ckeditor/; } - 注意:不能在同一
location块里混用root和alias,Nginx 启动直接报错
- 主站:
不复杂但容易忽略


















