alias通过前缀替换而非路径拼接实现多项目共用Nginx:每个location以/结尾,对应alias值也必须以/结尾,精准映射如/admin/→/opt/apps/admin/dist/,避免路径粘连;支持跨分区、跨挂载点资源整合,并需配合try_files兜底SPA路由。

多个项目共用一台 Nginx 时,用 alias 指令映射非根目录,核心是让每个 URL 前缀(比如 /admin/、/docs/)精准指向各自独立的物理目录,互不干扰,也不依赖统一的 root 结构。
每个项目配独立 location + alias
不要试图用一个 root 统管所有项目,而是为每个子应用单独定义 location 块,并用 alias 指向其构建产物所在路径:
location /admin/ { alias /opt/apps/admin/dist/; try_files $uri $uri/ /admin/index.html; }location /user/ { alias /opt/apps/user-app/build/; try_files $uri $uri/ /user/index.html; }location /api-docs/ { alias /srv/swagger-ui/; }
注意:所有 location 都以 / 结尾,对应 alias 值也必须以 / 结尾。这样请求 /admin/js/app.js 才会准确找到 /opt/apps/admin/dist/js/app.js,而不是拼错成 /opt/apps/admin/dist/admin/js/app.js。
斜杠必须严格一致,否则路径粘连
这是最常出错的地方。alias 不是“加在后面”,而是“替换掉前缀”。如果末尾斜杠不匹配,Nginx 会把剩余路径直接粘上去:
- ✅ 正确:
location /static/ { alias /mnt/cdn/assets/; }→/static/logo.png→/mnt/cdn/assets/logo.png - ❌ 错误:
location /static/ { alias /mnt/cdn/assets; }→/static/logo.png→/mnt/cdn/assetslogo.png(少个/,直接粘连) - ⚠️ 危险:
location /assets { alias /data/pics/; }→ 只匹配精确路径/assets,不覆盖/assets/icon.jpg
SPA 项目要加 try_files 回退
Vue、React 等单页应用启用 history 模式后,刷新页面可能 404。alias 映射静态资源没问题,但路由由前端接管,所以得兜底:
- 在对应 location 块里加上:
try_files $uri $uri/ /admin/index.html; - 注意这里的
/admin/index.html是相对于该 location 的 URI 路径,不是文件系统路径 - 不能写成
/opt/apps/admin/dist/index.html—— 这是物理路径,Nginx 不允许在 try_files 中用绝对路径
跨分区、跨挂载点也能整合
alias 不要求目标目录和 Nginx 配置在同一磁盘或同一挂载点。你可以把不同项目的 dist 目录放在不同位置:
- 管理后台:挂载在
/dev/sdb1→alias /mnt/ssd/admin-dist/; - 文档中心:NAS 共享目录 →
alias /mnt/nas/docs-v3/; - 用户端:容器卷映射 →
alias /app/frontend/build/;
只要路径真实存在、Nginx worker 进程有读取权限,就能正常服务。不需要它们有共同父目录,也不需要调整项目打包的 publicPath——alias 天然适配非根部署。


















