部署云服务项目

7 阅读12分钟

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 就行

目录

  1. 购买服务器
  2. 连接服务器
  3. 安装 JDK 21
  4. 安装 MySQL 8.0
  5. 创建数据库并导入数据
  6. 打包并部署后端
  7. 打包并部署前端
  8. 配置 Nginx 反向代理
  9. 配置阿里云安全组
  10. 访问测试
  11. 常见问题排查
  12. 常用运维命令

一、购买服务器

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 root
FLUSH 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.htmlVue Router 支持,刷新不 404
location /api/所有 /api/ 开头的请求转发给后端
proxy_pass http://localhost:8080/api/转发到 Java 后端

8.3 启动 Nginx

📍 在服务器终端执行(单条,逐步执行)

# 检查配置是否正确
nginx -t

看到 syntax is oktest 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/220.0.0.0/0SSH 连接
80/800.0.0.0/0前端 HTTP 访问

如果需要从外部直接连接 MySQL(用 Navicat 等),再加一条 3306 端口。生产环境不建议开放 3306。


十、访问测试

浏览器打开:

http://你的服务器IP

能看到前端页面并且能正常登录操作,就部署成功了!🎉


十一、常见问题排查

现象可能原因解决
ssh 连不上安全组没放行 22 端口阿里云控制台添加规则
浏览器打不开页面安全组没放行 80 端口同上
500 Internal Server ErrorNginx 权限不足chmod 755 /root && chmod -R 755 /root/frontend
页面 404Nginx root 路径不对检查 dist/ 目录是否存在
接口 404Nginx 代理路径不对检查 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 65JDK 版本不对确认 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 numberNginx 还没启动过直接执行 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

写在最后

部署这件事,第一次做觉得复杂,但流程其实就那几步:装环境 → 传代码 → 配代理 → 开端口。搞通一次之后,以后任何项目都是这个套路。

有问题欢迎交流 🎉