1. 项目概述
作为一名长期奋战在一线的全栈开发者,我经常遇到这样的场景:公司内部有多个前端项目需要同时上线,但域名资源有限,每个项目单独申请域名既不经济也不高效。这时候,Nginx的路径映射功能就成了救命稻草。通过合理配置,我们可以在同一个域名和端口下部署多个前端项目,通过URL路径进行区分。
这种方案特别适合以下场景:
- 企业内部管理系统(如OA、CRM、ERP等子系统)
- 微前端架构下的多个子应用
- 测试环境的多版本并行部署
- 个人开发者的小型项目集合
2. 核心原理与前置准备
2.1 Nginx路径映射的工作原理
Nginx的location指令配合alias或root,可以将不同的URL路径映射到服务器上的不同物理目录。当用户访问特定路径时,Nginx会根据配置将请求转发到对应的项目目录。
关键区别:
root指令会将location路径拼接到root路径后面alias指令则会用alias路径完全替换location路径
对于前端项目部署,通常推荐使用alias,因为它能更精确地控制路径映射关系。
2.2 项目准备要点
在开始配置前,需要确保:
- 所有前端项目都已配置正确的publicPath
- 项目打包后的静态文件已准备好
- Nginx已安装并可正常访问
- 服务器上有足够的存储空间
3. 前端项目配置详解
3.1 Vue项目配置
对于Vue CLI创建的项目,修改vue.config.js:
javascript复制// vue.config.js
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/my-project/' // 生产环境路径
: '/', // 开发环境路径
// 其他配置...
}
关键点:
- publicPath必须以斜杠开头和结尾
- 开发环境通常保持为根路径
- 生产环境路径应与Nginx配置的location匹配
3.2 React项目配置
Create React App项目需要在package.json中配置:
json复制{
"homepage": "/my-react-app/",
// 其他配置...
}
或者在构建时通过环境变量设置:
bash复制PUBLIC_URL=/my-react-app/ npm run build
3.3 静态资源处理注意事项
配置publicPath后,所有静态资源路径都会自动添加此前缀。需要特别注意:
- 绝对路径引用的资源需要检查是否正常工作
- 第三方库中硬编码的资源路径可能需要特殊处理
- 背景图片等CSS中的路径会自动处理
4. Nginx配置实战
4.1 基础配置模板
nginx复制server {
listen 80;
server_name example.com;
# 项目A配置
location /project-a/ {
alias /var/www/project-a/dist/;
index index.html;
try_files $uri $uri/ /project-a/index.html;
}
# 项目B配置
location /project-b/ {
alias /var/www/project-b/build/;
index index.html;
try_files $uri $uri/ /project-b/index.html;
}
}
4.2 关键配置解析
- alias:指定项目实际存放的物理路径
- try_files:用于支持前端路由,确保直接访问子路由时也能返回index.html
- index:指定默认访问的文件
4.3 高级配置技巧
4.3.1 日志分离
nginx复制location /project-a/ {
# ...其他配置
access_log /var/log/nginx/project-a.access.log main;
error_log /var/log/nginx/project-a.error.log;
}
4.3.2 缓存控制
nginx复制location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
4.3.3 Gzip压缩
nginx复制gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
5. 部署流程与验证
5.1 完整部署步骤
- 打包前端项目:
npm run build - 上传到服务器对应目录
- 修改Nginx配置
- 测试配置:
nginx -t - 重载配置:
nginx -s reload
5.2 常见验证方法
- 直接访问各项目URL
- 检查静态资源加载是否正常
- 测试前端路由跳转
- 查看Nginx访问日志
6. 问题排查与优化
6.1 常见问题及解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 404错误 | 路径配置错误 | 检查alias路径和项目实际路径是否一致 |
| 静态资源加载失败 | publicPath配置错误 | 确认打包时的publicPath与Nginx location匹配 |
| 路由跳转失败 | try_files配置缺失 | 确保每个location都有try_files回退到index.html |
| 样式错乱 | 资源路径问题 | 检查CSS中引用的资源路径 |
6.2 性能优化建议
- 启用HTTP/2提升加载效率
- 配置合理的缓存策略
- 对静态资源开启Brotli压缩
- 使用CDN加速静态资源
7. 安全注意事项
- 限制敏感目录访问:
nginx复制location ~ /\. {
deny all;
}
- 隐藏Nginx版本信息:
nginx复制server_tokens off;
- 设置安全头部:
nginx复制add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
8. 扩展应用场景
8.1 多环境部署
可以通过Nginx配置实现同一服务器上部署多个环境:
nginx复制location /dev/project-a/ {
alias /var/www/project-a/dev/;
# ...
}
location /prod/project-a/ {
alias /var/www/project-a/prod/;
# ...
}
8.2 灰度发布方案
结合Nginx的split_clients模块可以实现AB测试:
nginx复制split_clients "${remote_addr}AAA" $variant {
50% "/project-a/";
50% "/project-b/";
}
location / {
rewrite ^ $variant redirect;
}
8.3 微前端集成
对于微前端架构,可以通过Nginx实现子应用的路由转发:
nginx复制location /app1/ {
proxy_pass http://localhost:3001/;
}
location /app2/ {
proxy_pass http://localhost:3002/;
}
9. 实际案例分享
最近我们为某客户部署了一套包含5个子系统的管理平台,使用本文介绍的方法,在一个域名下实现了所有系统的部署。具体配置如下:
nginx复制server {
listen 443 ssl;
server_name admin.example.com;
# 主门户
location /portal/ {
alias /opt/apps/portal/dist/;
try_files $uri $uri/ /portal/index.html;
}
# CRM系统
location /crm/ {
alias /opt/apps/crm/build/;
try_files $uri $uri/ /crm/index.html;
}
# 订单系统
location /order/ {
alias /opt/apps/order/dist/;
try_files $uri $uri/ /order/index.html;
}
# 报表系统
location /report/ {
alias /opt/apps/report/;
try_files $uri $uri/ /report/index.html;
}
# 配置中心
location /config/ {
alias /opt/apps/config/public/;
try_files $uri $uri/ /config/index.html;
}
}
部署过程中我们遇到了路由冲突的问题,最终通过调整各项目的basePath和Nginx的try_files配置解决了问题。
10. 最佳实践总结
经过多个项目的实践,我总结了以下几点经验:
- 项目路径命名要有明确语义,避免使用容易混淆的名称
- 保持Nginx配置文件的模块化和可维护性
- 为每个项目单独设置日志文件,便于问题排查
- 在开发环境就模拟生产环境的路径配置
- 自动化部署脚本中要包含配置验证环节
对于大型项目,建议使用配置管理工具(如Ansible)来管理Nginx配置,确保多环境一致性。同时,建立完善的监控体系,及时发现和解决路径访问异常问题。