Java + Vue + MySQL 项目部署到阿里云 ECS 完整教程(小白向)
适用项目:Spring Boot 3.2 + Java 21 + Vue 3 + MySQL 8.0 服务器:阿里云 ECS · Alibaba Cloud Linux 3 · 2核2G
可视化工具 FileZilla 下载地址 下载 FileZilla Client 就行
目录
- 购买服务器
- 连接服务器
- 安装 JDK 21
- 安装 MySQL 8.0
- 创建数据库并导入数据
- 打包并部署后端
- 打包并部署前端
- 配置 Nginx 反向代理
- 配置阿里云安全组
- 访问测试
- 常见问题排查
- 常用运维命令
一、购买服务器
1.1 选什么类型?
| 实例类型 | 说明 | 适合场景 |
|---|---|---|
| e 实例 | 经济实惠,性价比高 ✅ | 个人项目、建站、小程序后端 |
| u1 实例 | CPU 性能更好 | Web 前端、计算密集型应用 |
| c7/g7 等 | 企业级高性能 | 大型应用、高并发 |
推荐 e 实例,便宜够用,个人开发者首选。
1.2 配置要求
部署 Java + Vue + MySQL 至少需要 2核2G,1G 内存不够用:
| 组件 | 大约占用内存 |
|---|---|
| 系统本身 | ~300MB |
| MySQL | ~400-800MB |
| Java 后端 | ~500MB-1GB |
| Nginx | ~50MB |
| 合计 | ~1.5-2.5GB |
1.3 购买时怎么选?
| 选项 | 选什么 |
|---|---|
| 地域 | 选离你最近的(推荐华东1杭州或华东2上海),不要选海外 |
| 可用区 | 默认就行 |
| 镜像 | 公共镜像 → Alibaba Cloud Linux 3 或 CentOS 7.9 |
| 带宽 | 3M 固定(个人项目够用) |
1.4 ECS 实例 vs 轻量应用服务器
| ECS 实例 | 轻量应用服务器 | |
|---|---|---|
| 操作方式 | 命令行 | 可选宝塔面板(网页管理) |
| 灵活性 | 高 | 低 |
| 适合 | 想学部署、有定制需求 | 纯小白、想点点点完成 |
如果选了带宝塔面板的轻量服务器,很多步骤可以用网页界面操作,不用敲命令。本教程以 ECS 命令行方式为主。
二、连接服务器
2.1 设置 root 密码
阿里云控制台 → ECS 实例 → 点击实例 → 重置实例密码,设置一个你能记住的密码。设置完后需要重启实例才能生效。
2.2 连接
打开 Mac 终端:
ssh root@你的服务器公网IP
📍 在 Mac 终端执行(单条)
注意:
- 第一次连接会提示
Are you sure you want to continue connecting?,输入yes回车 - 输入密码时屏幕不会显示任何字符,这是正常的,打完直接回车
- 如果连接超时,去阿里云控制台 → 安全组 → 确认 22 端口已放行
连接成功后提示符变成 [root@iZxxx ~]# 就对了。
三、安装 JDK 21
3.1 更新系统
📍 在服务器终端执行(单条)
yum update -y
等它跑完(可能需要 2-5 分钟)。
3.2 下载并安装 JDK 21
为什么不用 yum install?因为 Alibaba Cloud Linux 的 yum 源里可能没有 JDK 21,手动下载最靠谱。如果 yum 源有 JDK 21,也可以用 yum install -y java-21-openjdk java-21-openjdk-devel 安装。
📍 在服务器终端执行(单条,逐步执行)
# 第1步:下载 JDK 21
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
# 第2步:解压到 /usr/local/
tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
3.3 配置环境变量
解压后的目录名可能是 jdk-21.0.11(版本号会变化),先确认一下:
ls /usr/local/ | grep jdk
然后用实际目录名配置环境变量(把 jdk-21.0.11 换成你实际的目录名):
📍 在服务器终端执行(整块粘贴)
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/local/jdk-21.0.11
export PATH=$JAVA_HOME/bin:$PATH
EOF
📍 在服务器终端执行(单条)
source /etc/profile
3.4 验证安装
java -version
看到 java version "21.x.x" 就说明安装成功 ✅
如果提示 java: 未找到命令,说明环境变量里的目录名不对,重新执行 3.3 步骤,确认目录名正确。
四、安装 MySQL 8.0
4.1 添加 MySQL 官方安装源
📍 在服务器终端执行(单条,逐步执行)
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
rpm -ivh mysql80-community-release-el7-7.noarch.rpm
4.2 安装 MySQL
yum install -y mysql-community-server --nogpgcheck
为什么加
--nogpgcheck? 因为 GPG 签名检查可能会失败(Alibaba Cloud Linux 和 CentOS 的密钥不完全兼容),跳过检查直接安装即可,不影响安全性。
4.3 启动 MySQL
systemctl start mysqld
systemctl enable mysqld
为什么两个命令?
start是现在启动,enable是让服务器重启后也自动启动,防止重启后数据库没开导致项目挂掉。
4.4 获取临时密码
MySQL 首次安装会自动生成一个临时密码:
grep 'temporary password' /var/log/mysqld.log
输出类似:
2026-04-23T10:38:33.119763Z 6 [Note] A temporary password is generated for root@localhost: .lOolCkQu9jP
把密码记下来! 注意可能包含特殊字符(如开头的英文句号 .)。
4.5 登录 MySQL 并修改密码
mysql -u root -p
在服务器终端执行,输入临时密码。 输入密码时屏幕不显示字符,直接粘贴临时密码回车。
进入 MySQL 后(提示符变成 mysql>),执行以下 SQL:
📍 在 MySQL 里执行(整块粘贴)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Meilai2024';
CREATE USER 'root'@'%' IDENTIFIED BY 'Meilai2024';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
密码说明: MySQL 要求密码包含大小写字母、数字和特殊符号。如果上面密码报错,换成更复杂的如
Meilai@2024!。为什么创建
root@'%'? 默认 MySQL 只允许本机连接。%表示允许任何 IP 连接,方便以后用 Navicat 等工具从本地调试数据库。
4.6 验证新密码
mysql -u root -p
输入新密码,能进去就说明改好了。输入 exit 退出。
如果新密码登录失败: 可能是密码策略校验不通过。用跳过验证的方式重置:
systemctl stop mysqld mysqld_safe --skip-grant-tables & mysql -u rootFLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'Meilai2024'; exit;killall mysqld systemctl start mysqld mysql -u root -p
五、创建数据库并导入数据
5.1 在服务器上创建数据库
📍 在服务器终端执行(单条)
mysql -u root -p
CREATE DATABASE meilai CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
exit;
为什么用
utf8mb4? 它支持 emoji 和特殊字符,比普通的utf8更全面。
5.2 在本地 Mac 导出数据库
📍 在 Mac 终端执行(单条) — 新开一个终端窗口
mysqldump -u root -p meilai > /tmp/meilai_backup.sql
输入本地 MySQL 密码。如果本地 MySQL root 没有密码:
mysqldump -u root meilai > /tmp/meilai_backup.sql
Warning 可以忽略,不影响数据。
mysqldump只是读取数据,不会修改或删除任何内容,不影响其他项目。
5.3 上传到服务器
📍 在 Mac 终端执行(单条)
scp /tmp/meilai_backup.sql root@你的服务器IP:/root/
输入服务器 SSH 密码(就是连接服务器时输入的那个密码)。
上传成功后会显示文件名
meilai_backup.sql。
5.4 在服务器上导入数据
📍 在服务器终端执行(单条)
mysql -u root -p meilai < /root/meilai_backup.sql
输入 MySQL 密码。没有报错就说明导入成功。
六、打包并部署后端
6.1 本地打包
📍 在 Mac 终端执行(单条)
cd 你的Java项目目录
mvn clean package -DskipTests
打包完成后在 target/ 目录下生成 .jar 文件(如 meilai-server-1.0.0.jar)。
为什么
-DskipTests? 跳过测试加快打包速度,不影响生产使用。
6.2 在服务器上创建目录
📍 在服务器终端执行(单条)
mkdir -p /root/app
6.3 上传 jar 包到服务器
📍 在 Mac 终端执行(单条)
scp target/你的项目.jar root@你的服务器IP:/root/app/
输入服务器 SSH 密码。
6.4 启动后端
📍 在服务器终端执行(整块粘贴,一次性执行)
cd /root/app
nohup java -Xms256m -Xmx512m \
-Dspring.profiles.active=prod \
-DSERVER_PORT=8080 \
-DB_URL="jdbc:mysql://localhost:3306/meilai?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai" \
-DB_USERNAME=root \
-DB_PASSWORD="Meilai2024" \
-DJWT_SECRET="meilai-prod-secret-change-this-please" \
-jar meilai-server-1.0.0.jar > app.log 2>&1 &
参数解释:
| 参数 | 说明 |
|---|---|
-Xms256m -Xmx512m | 限制 JVM 内存(2G 服务器要给 MySQL 留空间) |
-Dspring.profiles.active=prod | 使用生产环境配置 |
-DSERVER_PORT=8080 | 后端端口 |
-DB_URL=... | 数据库连接地址 |
-DB_USERNAME / -DB_PASSWORD | 数据库账号密码(改成你实际设置的) |
-DJWT_SECRET=... | JWT 密钥(改成你自己的) |
nohup ... & | 后台运行,关闭终端也不会停 |
> app.log 2>&1 | 日志输出到文件 |
为什么 URL 要加引号? 因为 URL 中有
&符号,不加引号 shell 会把&当成后台运行符,命令会出错。
6.5 验证启动
tail -f /root/app/app.log
看到 Started 说明启动成功 ✅。按 Ctrl+C 退出日志查看(程序不会停)。
七、打包并部署前端
7.1 本地打包
📍 在 Mac 终端执行(单条)
cd 你的Vue项目目录
npm run build
如果 vue-tsc 报错(版本兼容问题),跳过类型检查直接打包:
npx vite build
打包完成后生成 dist/ 目录。
7.2 上传到服务器
📍 在 Mac 终端执行(单条)
scp -r dist/ root@你的服务器IP:/root/frontend/
输入服务器 SSH 密码。
八、配置 Nginx 反向代理
8.1 安装 Nginx
📍 在服务器终端执行(单条)
yum install -y nginx
8.2 写入配置文件
📍 在服务器终端执行(整块粘贴,一次性执行)
cat > /etc/nginx/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name 你的服务器IP;
location / {
root /root/frontend/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://localhost:8080/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
EOF
记得把
你的服务器IP换成实际的 IP 地址。
配置解释:
| 配置项 | 说明 |
|---|---|
listen 80 | 监听 80 端口,浏览器默认访问 80 |
root /root/frontend/dist | 前端静态文件位置 |
try_files $uri $uri/ /index.html | Vue Router 支持,刷新不 404 |
location /api/ | 所有 /api/ 开头的请求转发给后端 |
proxy_pass http://localhost:8080/api/ | 转发到 Java 后端 |
8.3 启动 Nginx
📍 在服务器终端执行(单条,逐步执行)
# 检查配置是否正确
nginx -t
看到 syntax is ok 和 test is successful 说明配置正确。
# 启动 Nginx
nginx
如果之前 Nginx 已经启动过,用
nginx -s reload重新加载配置。如果报
invalid PID number错误,说明 Nginx 还没启动过,直接用nginx启动即可。
8.4 解决权限问题
如果浏览器访问报 500 Internal Server Error,查看错误日志:
cat /var/log/nginx/error.log
如果看到 Permission denied,说明 Nginx 没有权限访问 /root/ 目录:
chmod 755 /root
chmod -R 755 /root/frontend
然后刷新浏览器。
8.5 设置开机自启
systemctl enable nginx
九、配置阿里云安全组
这一步必须做! 阿里云有两层防火墙(系统防火墙 + 安全组),两层都要配。
9.1 系统防火墙(如果开启了)
systemctl status firewalld
如果是 running:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
如果没开可以忽略。
9.2 阿里云安全组(必须配置)
去阿里云控制台 → ECS → 安全组 → 入方向 → 手动添加:
| 端口范围 | 授权对象 | 用途 |
|---|---|---|
| 22/22 | 0.0.0.0/0 | SSH 连接 |
| 80/80 | 0.0.0.0/0 | 前端 HTTP 访问 |
如果需要从外部直接连接 MySQL(用 Navicat 等),再加一条 3306 端口。生产环境不建议开放 3306。
十、访问测试
浏览器打开:
http://你的服务器IP
能看到前端页面并且能正常登录操作,就部署成功了!🎉
十一、常见问题排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
ssh 连不上 | 安全组没放行 22 端口 | 阿里云控制台添加规则 |
| 浏览器打不开页面 | 安全组没放行 80 端口 | 同上 |
| 500 Internal Server Error | Nginx 权限不足 | chmod 755 /root && chmod -R 755 /root/frontend |
| 页面 404 | Nginx root 路径不对 | 检查 dist/ 目录是否存在 |
| 接口 404 | Nginx 代理路径不对 | 检查 proxy_pass 和后端实际接口路径 |
| 接口 502 | 后端没启动或崩了 | tail -f /root/app/app.log 看日志 |
| 数据库连不上 | 密码错误或 MySQL 没启动 | 检查密码、systemctl status mysqld |
| 页面空白 | 前端打包有问题 | 检查 npm run build 有没有报错 |
java: 未找到命令 | JDK 环境变量没配好 | 重新 source /etc/profile,检查目录名 |
Unsupported class file major version 65 | JDK 版本不对 | 确认 java -version 是 21 |
| GPG 检查失败 | MySQL 安装签名问题 | 加 --nogpgcheck 参数 |
| MySQL 临时密码登不上去 | 安装不完整 | 删除重装:yum remove -y mysql-community-server && rm -rf /var/lib/mysql && yum install -y mysql-community-server --nogpgcheck |
Nginx 报 invalid PID number | Nginx 还没启动过 | 直接执行 nginx 启动 |
十二、常用运维命令
📍 以下命令均在服务器终端执行
后端管理
# 查看后端是否在运行
ps -ef | grep java
# 查看后端日志
tail -100f /root/app/app.log
# 重启后端
kill $(pgrep -f meilai-server-1.0.0.jar)
cd /root/app && nohup java -Xms256m -Xmx512m \
-Dspring.profiles.active=prod \
-DSERVER_PORT=8080 \
-DB_URL="jdbc:mysql://localhost:3306/meilai?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai" \
-DB_USERNAME=root \
-DB_PASSWORD="Meilai2024" \
-DJWT_SECRET="meilai-prod-secret-change-this-please" \
-jar meilai-server-1.0.0.jar > app.log 2>&1 &
Nginx
# 检查配置
nginx -t
# 重载配置
nginx -s reload
# 查看 Nginx 错误日志
cat /var/log/nginx/error.log
MySQL
# 登录
mysql -u root -p
# 查看状态
systemctl status mysqld
# 重启
systemctl restart mysqld
服务器
# 查看内存使用
free -h
# 查看磁盘空间
df -h
# 查看端口占用
netstat -tlnp | grep 8080
写在最后
部署这件事,第一次做觉得复杂,但流程其实就那几步:装环境 → 传代码 → 配代理 → 开端口。搞通一次之后,以后任何项目都是这个套路。
有问题欢迎交流 🎉