在阿里云服务器(ECS)上部署 Vue 或 React 前端项目,本质上是将构建后的静态资源(HTML/CSS/JS)通过 Web 服务器(如 Nginx)托管并对外提供服务。以下是完整、安全、生产就绪的部署流程(以 Ubuntu 22.04 为例,适用于 Vue 3 / React 18+):
✅ 一、前提准备
-
阿里云 ECS 实例
- 操作系统:推荐 Ubuntu 22.04 LTS 或 CentOS 7+(本文以 Ubuntu 为例)
- 安全组配置:放行 80(HTTP)和 443(HTTPS)端口(控制台 → 安全组 → 添加入方向规则)
- 建议使用密钥对登录(更安全)
-
本地开发环境
- 项目已通过
npm run build成功生成dist/(Vue)或build/(React)目录 - 确保
vue.config.js(Vue)或craco.config.js/webpack.config.js(React)中正确配置了publicPath:// Vue: vue.config.js module.exports = { publicPath: './', // 或 '/'(若部署在根路径);若部署在子路径如 /myapp/,则设为 '/myapp/' outputDir: 'dist' }// React: craco.config.js(使用 craco)或 package.json 中的 homepage 字段 // package.json "homepage": "./" // 或 "/" 或 "/myapp/"
- 项目已通过
✅ 二、服务器端操作(SSH 登录后执行)
1️⃣ 安装并配置 Nginx(推荐,轻量高效)
# 更新 & 安装 Nginx
sudo apt update
sudo apt install -y nginx
# 启动并设置开机自启
sudo systemctl enable nginx
sudo systemctl start nginx
# 验证:访问 http://<你的ECS公网IP>,应看到 "Welcome to nginx!"
2️⃣ 上传构建产物(3 种推荐方式)
| 方式 | 说明 | 命令示例 |
|---|---|---|
| ① SCP(简单直接) | 适合小项目、CI/CD 前手动部署 | scp -r ./dist/ ubuntu@<ECS_IP>:/var/www/myapp/ |
| ② Git + Hook(自动化) | 推荐!代码推送到服务器自动构建/部署 | 见下方扩展方案 |
| ③ SFTP(图形化) | 使用 FileZilla / WinSCP 拖拽上传 | 连接后上传到 /var/www/myapp/ |
✅ 推荐目录结构(权限规范):
sudo mkdir -p /var/www/myapp sudo chown -R $USER:$USER /var/www/myapp sudo chmod -R 755 /var/www将本地
dist/内容上传至/var/www/myapp/(确保包含index.html)
3️⃣ 配置 Nginx 站点(关键!支持前端路由 & 静态资源)
# 编辑新站点配置
sudo nano /etc/nginx/sites-available/myapp
粘贴以下配置(适配 Vue Router / React Router 的 history 模式):
server {
listen 80;
server_name your-domain.com; # ✅ 替换为你的域名(或留空用 IP 访问)
root /var/www/myapp;
index index.html;
# 支持前端路由:所有非资源请求都返回 index.html
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存优化
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 防止 .env / source 文件被访问(安全加固)
location ~ /. {
deny all;
}
}
✅ 启用站点:
# 创建软链接启用
sudo ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# 测试配置语法
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
🔍 验证:浏览器访问
http://<ECS公网IP>,应正常显示你的前端页面!
✅ 三、【强烈推荐】配置 HTTPS(SSL 证书)
使用免费 Let’s Encrypt(Certbot):
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com # ✅ 替换为你的已备案域名!
- ✅ 域名需在阿里云 完成 ICP 备案(国内必需!)
- ✅ DNS 解析 A 记录指向 ECS 公网 IP
- Certbot 会自动修改 Nginx 配置,启用 HTTPS 并强制跳转
✅ 四、进阶优化(生产必备)
| 优化项 | 操作 |
|---|---|
| ✅ 自动化部署(Git Hook) | 见下方扩展方案 |
| ✅ PM2 托管(仅需 SSR?) | 若你用 Nuxt/Next.js SSR,才需 Node.js + PM2;纯静态无需! |
| ✅ CDN 提速 | 阿里云 CDN + OSS:将 /var/www/myapp 同步到 OSS,CDN 回源 OSS,提速全球访问 |
| ✅ 日志与监控 | sudo tail -f /var/log/nginx/access.log;配合阿里云 ARMS 或 Prometheus |
⚠️ 常见问题排查
| 现象 | 原因 | 解决 |
|---|---|---|
| 白屏 / 路由 404 | publicPath 错误 或 Nginx 未配置 try_files |
检查 vue.config.js 中 publicPath: '/';确认 Nginx 配置含 try_files $uri $uri/ /index.html; |
| 静态资源 404 | 资源路径错误(如 main.js 404) |
查看浏览器 Network 标签,确认请求 URL;检查 publicPath 和构建输出路径 |
| 无法访问(超时) | 安全组未开放 80/443 端口 | 阿里云控制台 → ECS 实例 → 安全组 → 添加入方向规则(端口 80,443) |
| 权限拒绝(403) | Nginx 用户无权读取 /var/www/myapp |
sudo chown -R www-data:www-data /var/www/myapp & sudo chmod -R 755 /var/www/myapp |
🌟 扩展方案:Git 自动化部署(推荐)
# 在服务器创建裸仓库
mkdir /home/ubuntu/myapp.git && cd /home/ubuntu/myapp.git
git init --bare
# 编写 post-receive hook(自动部署)
nano hooks/post-receive
#!/bin/bash
GIT_REPO=/home/ubuntu/myapp.git
PUBLIC_WWW=/var/www/myapp
git --work-tree=$PUBLIC_WWW --git-dir=$GIT_REPO checkout -f
# 可选:安装依赖 & 构建(若需在服务器构建)
# cd $PUBLIC_WWW && npm ci && npm run build
chmod +x hooks/post-receive
本地推送即自动部署:
git remote add prod ubuntu@<ECS_IP>:/home/ubuntu/myapp.git
git push prod main
✅ 总结:核心步骤清单
- ✅ 本地
npm run build生成静态文件 - ✅ 上传
dist/到 ECS/var/www/myapp/ - ✅ 配置 Nginx(
try_files支持 history 路由) - ✅ 开放安全组端口(80/443)
- ✅ 配置 HTTPS(Let’s Encrypt + 域名备案)
- ✅ (可选)接入 CDN / Git 自动化 / 监控
💡 重要提醒:
- Vue/React 是纯前端框架,部署只需 Nginx,无需安装 Node.js 或运行
npm start(除非你做 SSR)。- 国内服务器必须完成 ICP 备案 才能绑定域名启用 HTTPS(阿里云备案系统直达)。
- 不要将
.env、源码、node_modules上传到服务器!
如需我为你生成:
- 完整的
nginx.conf示例 - Vue/React 的
vue.config.js/craco.config.js配置模板 - 自动化部署脚本(Shell/Ansible)
- Docker 部署方案(Nginx 容器化)
欢迎随时告诉我 👍
祝你部署顺利!🚀
云知识CLOUD