最近完成了课程设计 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:服务启动成功但无法访问

问题现象:后端日志显示启动成功,但浏览器访问接口无响应。

排查步骤

  1. 检查阿里云安全组是否放行 9763 端口
  2. 执行netstat -tulpn | grep 9763,确认端口是否在监听
  3. 在服务器本地执行curl http://127.0.0.1:9763,如果能返回响应,说明服务正常,问题出在网络或安全组

三、前端部署:静态文件的正确打开方式

前端是 Vue 项目,很多新手会犯一个低级错误:把整个前端源码上传到服务器,然后用npm run serve启动。这种方式不仅启动慢、占用资源多,而且关闭终端后服务就会停止。

正确的部署方式:Nginx 部署静态文件

Vue 项目打包后生成的dist目录是纯静态文件,只需要用 Nginx 托管即可,不需要 Node.js 环境。

  1. 本地执行npm run build打包,生成dist目录
  2. dist目录下的所有文件上传到服务器的/www/wwwroot/vue8081目录
  3. 在宝塔面板中点击「网站」→「添加站点」
    • 域名:填写你的服务器公网 IP
    • 根目录:选择/www/wwwroot/vue8081
    • PHP 版本:选择「纯静态」
  4. 保存后,直接访问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

问题现象:前端页面能打开,但点击登录按钮控制台报跨域错误。

解决方案:有两种常用方法,推荐使用第二种更优雅的方式

  1. 后端注解方式(快速解决):在所有 Controller 类上添加@CrossOrigin(origins = "*")注解,允许所有来源的请求
  2. 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 的任何功能。

最佳实践

  1. 部署前一定要清理项目中未使用的依赖,避免不必要的问题
  2. 如果确实需要使用 Redis,在宝塔面板软件商店中一键安装 Redis 即可
  3. 养成 "遇到错误先看日志" 的习惯,90% 的问题都能在日志中找到答案

五、常见问题排查速查表

为了方便大家快速定位问题,我整理了部署过程中最常见的错误和解决方法:

表格

错误现象可能原因解决方法
无法访问宝塔面板安全组未放行 8888 端口阿里云控制台添加 8888 端口规则
后端启动失败端口被占用fuser -k 9763/tcp 强制释放端口
前端页面空白静态文件路径错误检查 Nginx 根目录配置是否正确
接口返回 404后端接口路径写错对比本地和服务器的接口地址
上传文件大小限制Nginx 默认限制 2M修改 Nginx 配置client_max_body_size 100M;

六、部署心得与收获

这次从本地到云端的部署经历,让我对前后端分离架构有了全新的认识。本地开发时,我们习惯了 "一键运行" 的便利,很多问题都被 IDE 隐藏了。只有在真实的服务器环境中,我们才能遇到跨域、端口、权限、依赖冲突等实际工程问题。

通过这次实战,我总结出了三个最重要的经验:

  1. 日志是最好的老师:遇到错误不要慌,第一时间查看后端日志和浏览器控制台,错误信息会告诉你问题出在哪里
  2. 精简依赖,避免过度设计:不要为了 "技术栈好看" 而引入不需要的依赖,每多一个依赖就多一个出问题的可能
  3. 命令行是必备技能:宝塔面板虽然方便,但也要掌握基本的 Linux 命令,在面板出问题时能通过终端排查

从本地写代码到云端部署项目,是从 "学生" 到 "工程师" 的重要一步。当我看到自己的项目能通过公网正常访问,同学和老师都能登录使用时,所有的辛苦都变成了成就感。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐