从前端到后端:第一次把项目部署 上云的完整实战(含踩坑实录)

本文以一个真实上线的小程序后端(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(最磨人的一环)

这一环和写代码无关,但最影响上线节奏,务必提前:

  1. 域名实名 + ICP 备案 :备案是全流程最慢的(1~2 周),域名一确定就马上提交,和你本地开发并行跑,别等代码写完了才想起来。
  2. DNS 解析 :把 @、www、api 等子域名 A 记录指向你的服务器 IP。
  3. 申请免费 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 入口:

    bash 复制代码
    sudo ufw deny 8088   # 外网 8088 不可达,但 Nginx 反代本机 127.0.0.1:8088 不受影响
  • 记一笔证书到期时间,提前设日历提醒去续期(证书过期会导致全站 HTTPS 不可用)。


五、新手最容易踩的 6 个坑(精华)

  1. 数据库密码不一致 → 启动后全 502 Jar 内部配置文件里的密码,必须和服务器 MySQL 实际密码完全一致 。改了服务器密码忘了改配置、或两边写错一个字符,进程虽然能跑,但连不上库,Nginx 反代拿到 502。打包前先核对密码。

  2. restart 后立刻 curl 显示 502 是假象 SpringBoot 启动约 1 分钟才真正接受请求。重启后前几十秒 8088 还没就绪 → 误判失败。等 60 秒再测。

  3. 外网 443 Connection reset ≠ 你的问题 那是域名 ICP 备案未通过时被运营商拦截(标准端口 80/443 拦,非标端口不拦)。备案通过即自动恢复,和 Jar 无关。

  4. 公网端口别裸奔 生产环境关掉后端端口的公网直连(如 ufw deny 8088),只留 443 由 Nginx 反代。既安全又统一了入口。

  5. 小内存机器不加 swap,Java 可能根本起不来 1~2G 内存的云服务器,务必按 4.2 加 swap,否则 java -jar 直接 OOM 退出。

  6. 证书会过期 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(最磨人的一环)

这一环和写代码无关,但最影响上线节奏,务必提前:

  1. 域名实名 + ICP 备案 :备案是全流程最慢的(1~2 周),域名一确定就马上提交,和你本地开发并行跑,别等代码写完了才想起来。
  2. DNS 解析 :把 @、www、api 等子域名 A 记录指向你的服务器 IP。
  3. 申请免费 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 入口:

    bash 复制代码
    sudo ufw deny 8088   # 外网 8088 不可达,但 Nginx 反代本机 127.0.0.1:8088 不受影响
  • 记一笔证书到期时间,提前设日历提醒去续期(证书过期会导致全站 HTTPS 不可用)。


五、新手最容易踩的 6 个坑(精华)

  1. 数据库密码不一致 → 启动后全 502 Jar 内部配置文件里的密码,必须和服务器 MySQL 实际密码完全一致 。改了服务器密码忘了改配置、或两边写错一个字符,进程虽然能跑,但连不上库,Nginx 反代拿到 502。打包前先核对密码。

  2. restart 后立刻 curl 显示 502 是假象 SpringBoot 启动约 1 分钟才真正接受请求。重启后前几十秒 8088 还没就绪 → 误判失败。等 60 秒再测。

  3. 外网 443 Connection reset ≠ 你的问题 那是域名 ICP 备案未通过时被运营商拦截(标准端口 80/443 拦,非标端口不拦)。备案通过即自动恢复,和 Jar 无关。

  4. 公网端口别裸奔 生产环境关掉后端端口的公网直连(如 ufw deny 8088),只留 443 由 Nginx 反代。既安全又统一了入口。

  5. 小内存机器不加 swap,Java 可能根本起不来 1~2G 内存的云服务器,务必按 4.2 加 swap,否则 java -jar 直接 OOM 退出。

  6. 证书会过期 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,下一次你就会是那个能给同事讲清楚「请求到底去了哪」的人。

如果本文对你有帮助,欢迎点赞收藏。部署中有其他坑,也欢迎在评论区交流。

相关推荐
newerp44 分钟前
Execution Trace 深入实战:可视化调度与系统停顿分析
后端·程序员·go
Lambert2811 小时前
SAA 停摆的答案:前团队的 ARGI 我上手跑了一遍,缝了三针才跑通
后端·openai·ai编程
轻舟技术A1 小时前
Pi 的 Rust 实现来了:rpi,不止一个终端 Agent
开发语言·后端·rust
站大爷IP1 小时前
Python的字典遍历把我坑惨了,原来items和keys的区别这么大
后端
威哥爱编程2 小时前
【AI全栈12-01】Spring Boot 为何是 AI 全栈后端优选
java·spring boot·后端
汉堡大王95272 小时前
GPT-6 上线 48 小时,我扒开了 Intelligent UI 的运行机制:DIL、沙箱 Worker 和一个 React 式协调器
前端·javascript·后端
用户EasyAdminBlazor2 小时前
EasyAdminBlazor 实战:从 Entity 到完整 Admin Blazor 后台详解
后端
Bazingga2 小时前
AgentScope 到底是用来做什么的?一篇笔记说清楚
后端