从本地到云端:SpringBoot+Vue 项目完整部署实战记录
最近完成了课程设计 EMS 能源管理系统的开发,本地 IDEA 中一键运行、功能丝滑,但当我尝试将项目部署到阿里云服务器,让同学和老师都能通过公网访问时,却踩了整整两天的坑。从端口占用到跨域报错,从依赖冲突到服务异常,每一个问题都曾让我手足无措。最终我不仅成功完成了部署,还总结出了一套新手可直接复用、零跳步的部署流程,今天把完整的实战经验和避坑技巧分享给大家。
一、部署前准备:打好基础少踩坑
1. 服务器选型与系统选择
我选择了阿里云轻量应用服务器(2 核 2G 配置,足够支撑课程设计类项目),操作系统选用CentOS 7.9。选择这个版本的原因很简单:它是目前企业部署最稳定的版本之一,网上教程和解决方案最丰富,新手遇到问题更容易找到答案。
2. 一键安装宝塔面板(新手必备神器)
拿到服务器后,第一步就是安装宝塔 Linux 面板。它能把复杂的 Linux 命令操作可视化,让我们不用记住几十条命令就能管理服务器、安装软件、部署项目。
官方一键安装命令(直接复制到服务器终端执行):
bash
运行
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
💡 重要提示:安装过程中会提示是否确认安装,输入
y回车即可。整个安装过程大约 3-5 分钟,安装完成后终端会输出面板访问地址、用户名和密码,一定要保存好!
3. 提前配置环境与安全组
登录宝塔面板后,在「软件商店」一键安装以下必备软件:
- JDK 1.8:运行 SpringBoot 后端项目
- Nginx:部署前端静态文件、实现反向代理
同时,提前在阿里云安全组放行以下端口(这是 90% 新手部署后无法访问的根源):
- 80 端口:HTTP 默认访问端口
- 8081 端口:前端项目端口
- 9763 端口:后端项目端口
- 8888 端口:宝塔面板默认端口
二、后端部署:解决 Jar 包启动的三大经典坑
后端是 SpringBoot 项目,部署的核心就是将本地打包好的 Jar 包上传到服务器并运行。看似简单,但我在这里踩了三个最常见的坑。
坑 1:打包报错 no main manifest attribute
问题现象:在 IDEA 中执行mvn clean package -DskipTests打包成功,但上传到服务器运行时提示找不到主类。
根本原因:pom.xml 中没有配置 SpringBoot 打包插件,导致生成的 Jar 包没有主类入口信息。
解决方案:在 pom.xml 的build节点中添加以下插件配置:
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定你的主类全限定名 -->
<mainClass>com.lzpu.EmsApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
重新打包后,生成的 Jar 包就包含了完整的运行环境和主类信息。
坑 2:端口占用 Port 9763 already in use
问题现象:每次修改代码重新上传 Jar 包后,启动都会提示端口已被占用。
根本原因:旧的 Java 进程没有被正确关闭,一直在后台占用端口。
终极解决方案:养成 "先杀旧进程,再启动新进程" 的习惯,使用以下命令组合:
bash
运行
# 一键杀死所有同名Java进程(最省事)
pkill -f ems-0.0.1-SNAPSHOT.jar
# 后台启动服务,日志输出到run.log文件
nohup java -jar ems-0.0.1-SNAPSHOT.jar > run.log 2>&1 &
# 查看实时日志,确认启动成功
tail -f run.log
看到日志中输出Started EmsApplication in X seconds,就说明后端启动成功了。
坑 3:服务启动成功但无法访问
问题现象:后端日志显示启动成功,但浏览器访问接口无响应。
排查步骤:
- 检查阿里云安全组是否放行 9763 端口
- 执行
netstat -tulpn | grep 9763,确认端口是否在监听 - 在服务器本地执行
curl http://127.0.0.1:9763,如果能返回响应,说明服务正常,问题出在网络或安全组
三、前端部署:静态文件的正确打开方式
前端是 Vue 项目,很多新手会犯一个低级错误:把整个前端源码上传到服务器,然后用npm run serve启动。这种方式不仅启动慢、占用资源多,而且关闭终端后服务就会停止。
正确的部署方式:Nginx 部署静态文件
Vue 项目打包后生成的dist目录是纯静态文件,只需要用 Nginx 托管即可,不需要 Node.js 环境。
- 本地执行
npm run build打包,生成dist目录 - 将
dist目录下的所有文件上传到服务器的/www/wwwroot/vue8081目录 - 在宝塔面板中点击「网站」→「添加站点」
- 域名:填写你的服务器公网 IP
- 根目录:选择
/www/wwwroot/vue8081 - PHP 版本:选择「纯静态」
- 保存后,直接访问
http://你的服务器IP:8081就能打开前端页面
快速验证方式:Python 临时静态服务器
如果只是想快速验证前端文件是否正常,可以用 Python 一行命令启动临时服务器:
bash
运行
cd /www/wwwroot/vue8081
python3 -m http.server 8081
这种方式适合临时测试,不适合生产环境使用。
Vue History 模式部署注意事项
如果你的 Vue 项目使用了 History 路由模式,部署后会出现刷新页面 404 的问题。解决方法是在 Nginx 配置中添加以下规则:
nginx
location / {
try_files $uri $uri/ /index.html;
}
四、前后端联调:跨域与依赖问题的深度解析
前后端都部署成功后,最棘手的问题就是联调报错。我在这里遇到了两个最典型的问题。
问题 1:跨域错误 CORS policy
问题现象:前端页面能打开,但点击登录按钮控制台报跨域错误。
解决方案:有两种常用方法,推荐使用第二种更优雅的方式
- 后端注解方式(快速解决):在所有 Controller 类上添加
@CrossOrigin(origins = "*")注解,允许所有来源的请求 - Nginx 反向代理方式(生产环境推荐):通过 Nginx 将前端请求转发到后端,从根本上解决跨域问题
nginx
location /api/ { proxy_pass http://127.0.0.1:9763/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
问题 2:登录接口报 500 内部服务器错误
问题现象:跨域问题解决后,点击登录后端返回 500 错误。
排查与解决: 查看后端日志run.log,发现错误信息是Redis connection failed。原来我的项目中引入了 Redis 依赖,但服务器上并没有安装 Redis 服务,而且我在代码中根本没有使用 Redis 的任何功能。
最佳实践:
- 部署前一定要清理项目中未使用的依赖,避免不必要的问题
- 如果确实需要使用 Redis,在宝塔面板软件商店中一键安装 Redis 即可
- 养成 "遇到错误先看日志" 的习惯,90% 的问题都能在日志中找到答案
五、常见问题排查速查表
为了方便大家快速定位问题,我整理了部署过程中最常见的错误和解决方法:
表格
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 无法访问宝塔面板 | 安全组未放行 8888 端口 | 阿里云控制台添加 8888 端口规则 |
| 后端启动失败 | 端口被占用 | fuser -k 9763/tcp 强制释放端口 |
| 前端页面空白 | 静态文件路径错误 | 检查 Nginx 根目录配置是否正确 |
| 接口返回 404 | 后端接口路径写错 | 对比本地和服务器的接口地址 |
| 上传文件大小限制 | Nginx 默认限制 2M | 修改 Nginx 配置client_max_body_size 100M; |
六、部署心得与收获

这次从本地到云端的部署经历,让我对前后端分离架构有了全新的认识。本地开发时,我们习惯了 "一键运行" 的便利,很多问题都被 IDE 隐藏了。只有在真实的服务器环境中,我们才能遇到跨域、端口、权限、依赖冲突等实际工程问题。
通过这次实战,我总结出了三个最重要的经验:
- 日志是最好的老师:遇到错误不要慌,第一时间查看后端日志和浏览器控制台,错误信息会告诉你问题出在哪里
- 精简依赖,避免过度设计:不要为了 "技术栈好看" 而引入不需要的依赖,每多一个依赖就多一个出问题的可能
- 命令行是必备技能:宝塔面板虽然方便,但也要掌握基本的 Linux 命令,在面板出问题时能通过终端排查
从本地写代码到云端部署项目,是从 "学生" 到 "工程师" 的重要一步。当我看到自己的项目能通过公网正常访问,同学和老师都能登录使用时,所有的辛苦都变成了成就感。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)