本文以一个真实上线的小程序后端(RuoYi-Vue 框架)为蓝本,带你从「买一台云服务器」走到「全链路打通」。所有命令均可直接复制,每一处坑我都标了 ⚠️。适合会写 Vue/小程序、懂一点 Linux、但从没碰过生产服务器的前端同学。
一、为什么前端也要学部署
很多前端同学的状态是:页面写完了,接口一调就 404 / 502,然后甩一句「后端挂了」------但后端到底跑在哪、怎么起来的,完全没概念。
如果你想:
- 做全栈,不再被「联调不通」卡住;
- 从前端转后端,第一步却被「服务器」劝退;
- 哪怕不转岗,也想搞懂「我写的请求到底经过了什么才拿到数据」;
那部署就是你绕不开的一课。本文不堆概念,直接给你一条可复现的实战路径:买机器 → 初始化 → 装环境 → 打包 → 上线 → 加固,并把我踩过的坑一次性讲透。
读者画像 :会用 Vue / 小程序写页面,知道 npm install,在终端敲过命令,但 systemctl、ufw、Nginx 反代 这些词还比较陌生。
读完你能收获:一套能直接照抄的部署 checklist,以及 6 个新手必踩的坑(提前避开,省下几天排查时间)。
二、先建立全景:请求到底经过了什么
不要一上来就敲命令,先看清楚整体结构:
关键认知 :后端 Jar 跑在 8088,但公网绝不开放 8088 。外部只通过 443(Nginx)进来,Nginx 再把请求转发给本机 127.0.0.1:8088。这样做的好处:证书、域名、限流都在 Nginx 一层管,后端只管业务逻辑,且端口不直接暴露更安全。
三、全流程阶段总览(照着打勾)
| 阶段 | 目标 | 关键产出 |
|---|---|---|
| 1. 买服务器 + 连上 | 有一台能 SSH 的机器 | Xshell/Xftp 连上服务器 |
| 2. 系统初始化 | 内存/防火墙就绪 | 加了 swap、只开必要端口 |
| 3. 装 JDK | 能跑 Jar | java -version 正常 |
| 4. 装 MySQL | 有数据库 | 改端口、建库、导数据 |
| 5. 打包部署 | 后端跑起来 | Jar 用 systemd 开机自启 |
| 6. 域名+备案+HTTPS | 外网能访问 | Nginx 443 反代通了 |
| 7. 安全加固 | 上线不裸奔 | 改默认密码、关公网直连 |
下面逐阶段展开,敏感信息(IP / 密码 / 域名)均用占位符,请替换成你自己的。
下面是全流程的 Mermaid 总览图:

四、实战步骤
4.1 买云服务器 & 连上
- 选 Ubuntu 24.04 LTS、x86_64 即可(其他发行版命令略有差异)。
- 内存如果只有 1~2G,一定要加 swap(见 4.2),否则 Java 很容易起不来。
- 连接工具推荐新手用 Xshell(终端)+ Xftp(传文件) :图形化拖文件比记
scp命令轻松太多。 - ⚠️ 首次连接会弹「SSH 安全警告 / 指纹确认」,这是正常流程,确认是你自己的服务器后点「接受并保存」即可(之后不再询问)。
4.2 系统初始化(小内存必做)
bash
# 加 2G swap,避免 Java 因内存不足 OOM
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 验证:free -h 应看到 Swap 2.0Gi
# 防火墙只开必要端口:22(SSH) + 你的业务端口
sudo ufw allow 22
sudo ufw allow 8088
sudo ufw enable
# 同时去云厂商控制台「安全组」把对应端口入方向放行
4.3 装 JDK
bash
sudo apt update
sudo apt install -y openjdk-8-jdk
java -version # 能看到 1.8.x 即成功
4.4 装 MySQL(改端口 + 建库导数据)
bash
sudo apt install -y mysql-server
# 改成非默认端口(示例 3310,减少被扫描的概率)
sudo sed -i '/^\[mysqld\]/a port = 3310' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo systemctl enable mysql
# 设置 root 密码(⚠️ 换成你自己的强密码,并牢牢记住!)
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; FLUSH PRIVILEGES;"
建库 + 导入本地数据:
bash
# ① 本地导出整库(在你自己电脑上)
mysqldump -u root -p -P 3310 你的库名 > backup.sql
# ② 用 Xftp 把 backup.sql 传到服务器 /opt/yourproject/scripts/
# ③ 服务器上建库并导入
mysql -u root -p'你的数据库密码' -P 3310 -e "CREATE DATABASE IF NOT EXISTS \`你的库名\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mysql -u root -p'你的数据库密码' -P 3310 你的库名 < /opt/yourproject/scripts/backup.sql
mysql -u root -p'你的数据库密码' -P 3310 你的库名 -e "SHOW TABLES;" # 表应齐全
💡 经验:导入数据后,如果业务有「防重复」之类的唯一约束(比如一天只能打卡一次),记得跑对应的索引修复/初始化脚本,否则上线后会出现诡异的 500。这一步最好在「启动后端之前」完成。
4.5 本地打包 & 部署 Jar
前端同学这里最容易卡:本地可能根本没装 Maven。
powershell
# Windows PowerShell:把 Maven 加入 PATH(换成你的 Maven 安装目录)
$env:PATH = 'C:\你的Maven目录\bin;' + $env:PATH
# 进入后端项目根目录,跳过测试打包
cd 你的项目目录
mvn clean package -DskipTests
# 产物:ruoyi-admin/target/ruoyi-admin.jar(看到 BUILD SUCCESS 才算好)
然后用 Xftp 把 ruoyi-admin.jar 拖到服务器 /opt/yourproject/backend/。
配置 systemd 开机自启 (不用每次手动 java -jar):
bash
sudo vim /etc/systemd/system/yourproject.service
ini
[Unit]
Description=YourProject Backend
After=network.target mysql.service redis.service
[Service]
User=root
WorkingDirectory=/opt/yourproject/backend
ExecStart=/usr/bin/java -jar /opt/yourproject/backend/ruoyi-admin.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable yourproject
sudo systemctl restart yourproject
# ⚠️ SpringBoot 启动较慢,约等 60 秒再测
sleep 60
systemctl status yourproject --no-pager # 应 active (running)
journalctl -u yourproject -n 60 --no-pager # 看到 Started xxxApplication 即成功
下面是本地打包到部署上线的完整流程:

4.6 域名 / 备案 / HTTPS(最磨人的一环)
这一环和写代码无关,但最影响上线节奏,务必提前:
- 域名实名 + ICP 备案 :备案是全流程最慢的(1~2 周),域名一确定就马上提交,和你本地开发并行跑,别等代码写完了才想起来。
- DNS 解析 :把
@、www、api等子域名 A 记录指向你的服务器 IP。 - 申请免费 SSL 证书(云厂商控制台或 certbot 都行),配置 Nginx 的 443 反代:
nginx
server {
listen 443 ssl;
server_name api.yourdomain.com;
ssl_certificate /etc/nginx/ssl/api.yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/api.yourdomain.com.key;
location / {
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
bash
sudo nginx -t # 测试配置
sudo systemctl reload nginx
⚠️ 备案通过前,外网访问 443 会被运营商拦截(Connection reset),这不是你配置错了,是合规拦截,备案一过自动恢复。
4.7 上线后安全收尾(别跳过)
-
改掉默认数据库密码 ,并且------同步修改 Jar 里配置文件中的密码再重新打包重启!配置文件密码必须和服务器 MySQL 实际密码一字不差(详见第五节坑 1)。
-
关掉公网对后端端口的直连 ,只留 443 入口:
bashsudo ufw deny 8088 # 外网 8088 不可达,但 Nginx 反代本机 127.0.0.1:8088 不受影响 -
记一笔证书到期时间,提前设日历提醒去续期(证书过期会导致全站 HTTPS 不可用)。
五、新手最容易踩的 6 个坑(精华)
-
数据库密码不一致 → 启动后全 502 Jar 内部配置文件里的密码,必须和服务器 MySQL 实际密码完全一致 。改了服务器密码忘了改配置、或两边写错一个字符,进程虽然能跑,但连不上库,Nginx 反代拿到 502。打包前先核对密码。
-
restart 后立刻 curl 显示 502 是假象 SpringBoot 启动约 1 分钟才真正接受请求。重启后前几十秒 8088 还没就绪 → 误判失败。等 60 秒再测。
-
外网 443 Connection reset ≠ 你的问题 那是域名 ICP 备案未通过时被运营商拦截(标准端口 80/443 拦,非标端口不拦)。备案通过即自动恢复,和 Jar 无关。
-
公网端口别裸奔 生产环境关掉后端端口的公网直连(如
ufw deny 8088),只留 443 由 Nginx 反代。既安全又统一了入口。 -
小内存机器不加 swap,Java 可能根本起不来 1~2G 内存的云服务器,务必按 4.2 加 swap,否则
java -jar直接 OOM 退出。 -
证书会过期 Let's Encrypt / 云厂商免费证书通常 90 天。提前设提醒,到期前续期(一般只需覆盖证书文件 +
nginx -s reload)。
六、给前端同学的学习建议
- 部署不是后端专属技能。懂了全链路,联调不通时你能自己定位:是 Nginx 没反代?Jar 没起来?还是数据库密码不对?而不再只会说「接口挂了」。
- 本地也搭一套 MySQL + Redis,尽量模拟生产环境(端口、密码规则一致),把「连接不上」提前在本地暴露。
- 把你的部署过程写成文档。本文其实就是一份内部「部署进度清单」的脱敏改写------边做边记,下次恢复部署你才知道「从哪接手」。
七、最小发布口诀(速查)
买机器 → 加 swap/开防火墙 → 装 JDK/MySQL/Redis →
mvn package打包 → Xftp 传 Jar → systemd 自启 → 等 60 秒 → 本机 8088 与外网 443 都返回 200 → 改密码 + 关公网直连 → 完成。
写在最后:部署这件事,「第一次」最痛苦,因为全是陌生名词。但走过一遍你会发现,它无非是「装环境 → 跑程序 → 用 Nginx 兜入口 → 收尾加固」的固定套路。把它变成你自己的 checklist,下一次你就会是那个能给同事讲清楚「请求到底去了哪」的人。
如果本文对你有帮助,欢迎点赞收藏。部署中有其他坑,也欢迎在评论区交流。
从前端到后端:第一次把项目部署上云的完整实战(含踩坑实录)
本文以一个真实上线的小程序后端(RuoYi-Vue 框架)为蓝本,带你从「买一台云服务器」走到「全链路打通」。所有命令均可直接复制,每一处坑我都标了 ⚠️。适合会写 Vue/小程序、懂一点 Linux、但从没碰过生产服务器的前端同学。
一、为什么前端也要学部署
很多前端同学的状态是:页面写完了,接口一调就 404 / 502,然后甩一句「后端挂了」------但后端到底跑在哪、怎么起来的,完全没概念。
如果你想:
- 做全栈,不再被「联调不通」卡住;
- 从前端转后端,第一步却被「服务器」劝退;
- 哪怕不转岗,也想搞懂「我写的请求到底经过了什么才拿到数据」;
那部署就是你绕不开的一课。本文不堆概念,直接给你一条可复现的实战路径:买机器 → 初始化 → 装环境 → 打包 → 上线 → 加固,并把我踩过的坑一次性讲透。
读者画像 :会用 Vue / 小程序写页面,知道 npm install,在终端敲过命令,但 systemctl、ufw、Nginx 反代 这些词还比较陌生。
读完你能收获:一套能直接照抄的部署 checklist,以及 6 个新手必踩的坑(提前避开,省下几天排查时间)。
二、先建立全景:请求到底经过了什么
不要一上来就敲命令,先看清楚整体结构:
yaml
小程序 / Web 前端
│ HTTPS(443)
▼
Nginx(反向代理 + SSL 证书)
│ http(127.0.0.1:8088,仅本机)
▼
后端 Jar(SpringBoot,监听 8088)
│
├──▶ MySQL(示例端口 3310)
└──▶ Redis(示例端口 6379)
关键认知 :后端 Jar 跑在 8088,但公网绝不开放 8088 。外部只通过 443(Nginx)进来,Nginx 再把请求转发给本机 127.0.0.1:8088。这样做的好处:证书、域名、限流都在 Nginx 一层管,后端只管业务逻辑,且端口不直接暴露更安全。
三、全流程阶段总览(照着打勾)
| 阶段 | 目标 | 关键产出 |
|---|---|---|
| 1. 买服务器 + 连上 | 有一台能 SSH 的机器 | Xshell/Xftp 连上服务器 |
| 2. 系统初始化 | 内存/防火墙就绪 | 加了 swap、只开必要端口 |
| 3. 装 JDK | 能跑 Jar | java -version 正常 |
| 4. 装 MySQL | 有数据库 | 改端口、建库、导数据 |
| 5. 打包部署 | 后端跑起来 | Jar 用 systemd 开机自启 |
| 6. 域名+备案+HTTPS | 外网能访问 | Nginx 443 反代通了 |
| 7. 安全加固 | 上线不裸奔 | 改默认密码、关公网直连 |
下面逐阶段展开,敏感信息(IP / 密码 / 域名)均用占位符,请替换成你自己的。
四、实战步骤
4.1 买云服务器 & 连上
- 选 Ubuntu 24.04 LTS、x86_64 即可(其他发行版命令略有差异)。
- 内存如果只有 1~2G,一定要加 swap(见 4.2),否则 Java 很容易起不来。
- 连接工具推荐新手用 Xshell(终端)+ Xftp(传文件) :图形化拖文件比记
scp命令轻松太多。 - ⚠️ 首次连接会弹「SSH 安全警告 / 指纹确认」,这是正常流程,确认是你自己的服务器后点「接受并保存」即可(之后不再询问)。
4.2 系统初始化(小内存必做)
bash
# 加 2G swap,避免 Java 因内存不足 OOM
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 验证:free -h 应看到 Swap 2.0Gi
# 防火墙只开必要端口:22(SSH) + 你的业务端口
sudo ufw allow 22
sudo ufw allow 8088
sudo ufw enable
# 同时去云厂商控制台「安全组」把对应端口入方向放行
4.3 装 JDK
bash
sudo apt update
sudo apt install -y openjdk-8-jdk
java -version # 能看到 1.8.x 即成功
4.4 装 MySQL(改端口 + 建库导数据)
bash
sudo apt install -y mysql-server
# 改成非默认端口(示例 3310,减少被扫描的概率)
sudo sed -i '/^\[mysqld\]/a port = 3310' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo systemctl enable mysql
# 设置 root 密码(⚠️ 换成你自己的强密码,并牢牢记住!)
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; FLUSH PRIVILEGES;"
建库 + 导入本地数据:
bash
# ① 本地导出整库(在你自己电脑上)
mysqldump -u root -p -P 3310 你的库名 > backup.sql
# ② 用 Xftp 把 backup.sql 传到服务器 /opt/yourproject/scripts/
# ③ 服务器上建库并导入
mysql -u root -p'你的数据库密码' -P 3310 -e "CREATE DATABASE IF NOT EXISTS \`你的库名\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mysql -u root -p'你的数据库密码' -P 3310 你的库名 < /opt/yourproject/scripts/backup.sql
mysql -u root -p'你的数据库密码' -P 3310 你的库名 -e "SHOW TABLES;" # 表应齐全
💡 经验:导入数据后,如果业务有「防重复」之类的唯一约束(比如一天只能打卡一次),记得跑对应的索引修复/初始化脚本,否则上线后会出现诡异的 500。这一步最好在「启动后端之前」完成。
4.5 本地打包 & 部署 Jar
前端同学这里最容易卡:本地可能根本没装 Maven。
powershell
# Windows PowerShell:把 Maven 加入 PATH(换成你的 Maven 安装目录)
$env:PATH = 'C:\你的Maven目录\bin;' + $env:PATH
# 进入后端项目根目录,跳过测试打包
cd 你的项目目录
mvn clean package -DskipTests
# 产物:ruoyi-admin/target/ruoyi-admin.jar(看到 BUILD SUCCESS 才算好)
然后用 Xftp 把 ruoyi-admin.jar 拖到服务器 /opt/yourproject/backend/。
配置 systemd 开机自启 (不用每次手动 java -jar):
bash
sudo vim /etc/systemd/system/yourproject.service
ini
[Unit]
Description=YourProject Backend
After=network.target mysql.service redis.service
[Service]
User=root
WorkingDirectory=/opt/yourproject/backend
ExecStart=/usr/bin/java -jar /opt/yourproject/backend/ruoyi-admin.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable yourproject
sudo systemctl restart yourproject
# ⚠️ SpringBoot 启动较慢,约等 60 秒再测
sleep 60
systemctl status yourproject --no-pager # 应 active (running)
journalctl -u yourproject -n 60 --no-pager # 看到 Started xxxApplication 即成功
4.6 域名 / 备案 / HTTPS(最磨人的一环)
这一环和写代码无关,但最影响上线节奏,务必提前:
- 域名实名 + ICP 备案 :备案是全流程最慢的(1~2 周),域名一确定就马上提交,和你本地开发并行跑,别等代码写完了才想起来。
- DNS 解析 :把
@、www、api等子域名 A 记录指向你的服务器 IP。 - 申请免费 SSL 证书(云厂商控制台或 certbot 都行),配置 Nginx 的 443 反代:
nginx
server {
listen 443 ssl;
server_name api.yourdomain.com;
ssl_certificate /etc/nginx/ssl/api.yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/api.yourdomain.com.key;
location / {
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
bash
sudo nginx -t # 测试配置
sudo systemctl reload nginx
⚠️ 备案通过前,外网访问 443 会被运营商拦截(Connection reset),这不是你配置错了,是合规拦截,备案一过自动恢复。
4.7 上线后安全收尾(别跳过)
-
改掉默认数据库密码 ,并且------同步修改 Jar 里配置文件中的密码再重新打包重启!配置文件密码必须和服务器 MySQL 实际密码一字不差(详见第五节坑 1)。
-
关掉公网对后端端口的直连 ,只留 443 入口:
bashsudo ufw deny 8088 # 外网 8088 不可达,但 Nginx 反代本机 127.0.0.1:8088 不受影响 -
记一笔证书到期时间,提前设日历提醒去续期(证书过期会导致全站 HTTPS 不可用)。
五、新手最容易踩的 6 个坑(精华)
-
数据库密码不一致 → 启动后全 502 Jar 内部配置文件里的密码,必须和服务器 MySQL 实际密码完全一致 。改了服务器密码忘了改配置、或两边写错一个字符,进程虽然能跑,但连不上库,Nginx 反代拿到 502。打包前先核对密码。
-
restart 后立刻 curl 显示 502 是假象 SpringBoot 启动约 1 分钟才真正接受请求。重启后前几十秒 8088 还没就绪 → 误判失败。等 60 秒再测。
-
外网 443 Connection reset ≠ 你的问题 那是域名 ICP 备案未通过时被运营商拦截(标准端口 80/443 拦,非标端口不拦)。备案通过即自动恢复,和 Jar 无关。
-
公网端口别裸奔 生产环境关掉后端端口的公网直连(如
ufw deny 8088),只留 443 由 Nginx 反代。既安全又统一了入口。 -
小内存机器不加 swap,Java 可能根本起不来 1~2G 内存的云服务器,务必按 4.2 加 swap,否则
java -jar直接 OOM 退出。 -
证书会过期 Let's Encrypt / 云厂商免费证书通常 90 天。提前设提醒,到期前续期(一般只需覆盖证书文件 +
nginx -s reload)。
六、给前端同学的学习建议
- 部署不是后端专属技能。懂了全链路,联调不通时你能自己定位:是 Nginx 没反代?Jar 没起来?还是数据库密码不对?而不再只会说「接口挂了」。
- 本地也搭一套 MySQL + Redis,尽量模拟生产环境(端口、密码规则一致),把「连接不上」提前在本地暴露。
- 把你的部署过程写成文档。本文其实就是一份内部「部署进度清单」的脱敏改写------边做边记,下次恢复部署你才知道「从哪接手」。
七、最小发布口诀(速查)
买机器 → 加 swap/开防火墙 → 装 JDK/MySQL/Redis →
mvn package打包 → Xftp 传 Jar → systemd 自启 → 等 60 秒 → 本机 8088 与外网 443 都返回 200 → 改密码 + 关公网直连 → 完成。
写在最后:部署这件事,「第一次」最痛苦,因为全是陌生名词。但走过一遍你会发现,它无非是「装环境 → 跑程序 → 用 Nginx 兜入口 → 收尾加固」的固定套路。把它变成你自己的 checklist,下一次你就会是那个能给同事讲清楚「请求到底去了哪」的人。
如果本文对你有帮助,欢迎点赞收藏。部署中有其他坑,也欢迎在评论区交流。