在阿里云服务器(如 ECS)上配置前端 + 后端共存的环境,核心目标是:让前端静态资源(如 Vue/React 打包产物)和后端服务(如 Node.js/Java/Python)协同工作,对外统一通过 80/443 端口提供 Web 服务,并解决跨域、路由转发、HTTPS 等实际问题。
以下是推荐且生产可用的标准化方案(以 Nginx 反向X_X为核心),适用于绝大多数场景(Vue/React + Node.js/Express/Spring Boot/FastAPI 等):
✅ 一、整体架构设计(推荐)
用户浏览器
↓ (HTTP/HTTPS, 端口 80/443)
[阿里云 ECS]
↓
Nginx(主入口,静态托管 + 反向X_X)
├─ / → 前端静态文件(dist/ 目录)
└─ /api/ /admin/ /v1/ 等 → 反向X_X到后端服务(如 http://127.0.0.1:3000)
✅ 优势:零跨域、SEO友好、支持 HTTPS/缓存/压缩/负载均衡扩展、前后端完全解耦、符合运维规范。
✅ 二、详细配置步骤(以 Ubuntu 22.04 + Nginx + Vue + Express 为例)
1️⃣ 准备工作
# 更新系统 & 安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install nginx curl git wget unzip -y
# 开放安全组端口(阿里云控制台操作!)
# ✅ 必须开放:80(HTTP)、443(HTTPS)、22(SSH)
# ❌ 不要开放后端端口(如 3000/8080)给公网!仅限内网访问
2️⃣ 部署后端服务(示例:Node.js/Express)
# 创建后端目录
sudo mkdir -p /var/www/backend
sudo chown -R $USER:$USER /var/www/backend
# 上传或克隆你的后端代码(如 Express)
cd /var/www/backend
# 示例:git clone https://github.com/your/repo.git .
# 或上传 dist 文件夹
# 安装依赖并测试运行(确保监听 127.0.0.1:3000,非 0.0.0.0:3000!)
npm install
# 修改 app.js:app.listen(3000, '127.0.0.1', () => {...})
npm start & # 临时测试(生产请用 PM2)
# ✅ 推荐:使用 PM2 管理(自动重启、日志、开机自启)
npm install -g pm2
pm2 start app.js --name "my-backend"
pm2 startup # 生成开机自启脚本
pm2 save
3️⃣ 部署前端(示例:Vue CLI 打包产物)
# 构建前端(本地执行)
# vue.config.js 中配置:publicPath: '/' 或 '/subpath/'(若需子路径)
# npm run build → 输出 dist/ 目录
# 上传 dist/ 到服务器
sudo mkdir -p /var/www/frontend
sudo rsync -avz ./dist/ user@your-ecs-ip:/var/www/frontend/
# 设置权限
sudo chown -R www-data:www-data /var/www/frontend
sudo chmod -R 755 /var/www/frontend
4️⃣ 配置 Nginx(关键!)
# 编辑默认站点配置(或新建 conf)
sudo nano /etc/nginx/sites-available/myapp
# 写入以下内容(根据实际调整):
server {
listen 80;
server_name your-domain.com; # 替换为你的域名(需已解析到 ECS 公网 IP)
# 强制跳转 HTTPS(可选但强烈推荐)
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL 证书(使用阿里云免费证书或 Let's Encrypt)
ssl_certificate /etc/nginx/ssl/your-domain.pem; # 阿里云下载的 PEM
ssl_certificate_key /etc/nginx/ssl/your-domain.key; # 阿里云下载的 KEY
# 前端静态资源(根路径)
location / {
root /var/www/frontend;
try_files $uri $uri/ /index.html; # 支持 Vue Router history 模式
index index.html;
}
# 后端 API 接口(统一前缀,避免跨域)
location /api/ {
proxy_pass http://127.0.0.1:3000/; # 注意末尾的 '/' —— 实现路径重写!
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
# 可选:其他接口前缀(如管理后台)
# location /admin-api/ {
# proxy_pass http://127.0.0.1:8081/;
# }
# 静态资源缓存优化
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
✅ 关键说明:
proxy_pass http://127.0.0.1:3000/末尾/表示:/api/users→ 转发到http://127.0.0.1:3000/users(自动剥离/api)try_files $uri $uri/ /index.html:解决 Vue/React Router history 模式 404 问题- 后端代码中 无需处理跨域(CORS),因为所有请求都走同源(
/api/)
5️⃣ 启用配置 & 重启 Nginx
# 启用站点(创建软链接)
sudo ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# 测试配置语法
sudo nginx -t
# 重新加载(不中断服务)
sudo systemctl reload nginx
# 设为开机自启(如未启用)
sudo systemctl enable nginx
6️⃣ 配置 HTTPS(阿里云免费证书)
- 登录 阿里云 SSL 证书服务
- 免费申请「DV」证书(验证域名邮箱或 DNS)
- 下载证书(选择 Nginx 版本),得到
.pem和.key文件 - 上传到服务器
/etc/nginx/ssl/目录 - 在 Nginx 配置中指定路径(见上文)
✅ 进阶:用 Certbot 自动续期(推荐用于 Let’s Encrypt)
7️⃣ 阿里云安全组设置(⚠️ 必做!)
- 登录 ECS 控制台 → 实例 → 安全组 → 配置规则
- 入方向规则:
- HTTP: 端口 80,授权对象
0.0.0.0/0 - HTTPS: 端口 443,授权对象
0.0.0.0/0 - SSH: 端口 22,授权对象建议限制为你的 IP(如
123.45.67.89/32)
- HTTP: 端口 80,授权对象
- 禁止开放后端端口(3000/8080等)给公网!(只允许
127.0.0.1访问)
✅ 三、常见问题与解决方案
| 问题 | 原因 | 解决 |
|---|---|---|
| 前端白屏 / 404 | try_files 未配置 或 publicPath 错误 |
检查 Vue 的 vue.config.js 中 publicPath: '/';确认 Nginx root 路径正确 |
| API 返回 502 Bad Gateway | 后端未启动 / 端口错误 / proxy_pass 地址不对 |
curl http://127.0.0.1:3000/api/test 测试;检查 PM2 状态 pm2 list |
接口返回 404(如 /api/login) |
proxy_pass 末尾缺少 /,导致路径未重写 |
改为 proxy_pass http://127.0.0.1:3000/;(注意斜杠) |
| 页面加载慢 | 静态资源未压缩/缓存 | Nginx 开启 gzip,添加 expires 规则(见上方配置) |
| HTTPS 不生效 | 证书路径错误 / 未重启 Nginx / 安全组未开 443 | sudo nginx -t && sudo systemctl reload nginx;检查证书路径权限 |
✅ 四、进阶建议(生产环境)
- 🔐 安全加固:安装 Fail2ban、禁用 root 登录、配置 UFW 防火墙
- 📈 监控告警:用阿里云 ARMS 或 Prometheus + Grafana 监控 Nginx/PM2
- 🚀 CI/CD 自动化:用 GitHub Actions / 阿里云流水线实现 push 即部署
- 🌐 多环境分离:用不同子域名(
dev.your.com,prod.your.com)或路径区分 - 🧩 容器化(可选):Docker Compose 管理 Nginx + 后端 + Redis,更易迁移
✅ 五、替代方案对比(不推荐新手直接用)
| 方案 | 是否推荐 | 说明 |
|---|---|---|
| 前端用 Nginx,后端直接暴露端口 + CORS | ❌ | 存在安全风险(暴露后端端口)、跨域配置繁琐、无法统一 HTTPS |
前端用 serve -s 或 http-server |
❌ | 无反向X_X、无缓存、无 HTTPS、不支持 history 模式、非生产级 |
| 后端(如 Express)同时托管前端 | ⚠️ | 适合极简原型,但性能/缓存/安全不如 Nginx,且耦合度高 |
✅ 总结一句话:
用 Nginx 做统一入口:静态资源直出 + API 反向X_X + HTTPS 终止,是最稳定、安全、可扩展的共存方案。
需要我为你生成:
- ✅ 完整的
nginx.conf模板(含 gzip、SSL、缓存) - ✅ Vue/React 的
vue.config.js或craco.config.js配置示例 - ✅ PM2 启动脚本 + 日志轮转配置
- ✅ 阿里云一键部署 Shell 脚本
欢迎随时告诉我你的技术栈(如 Spring Boot + Vue3?Django + React?),我可以为你定制完整配置!
祝你部署顺利!🚀
ECLOUD博客