Spring Boot项目从开发到线上部署
Spring Boot 项目从开发到线上部署:一位独立开发者的完整流程
很多刚入门的开发者写完了 Spring Boot 代码,却卡在「怎么把它跑起来」这一步。本地跑得好好的,一上服务器就各种问题。
今天把我的上线流程完整写出来,从 JAR 包到后台守护,一步不落。
🚀 第一步:打包
本地开发完成后,第一步是把代码打成可执行的 JAR 包。
mvn clean package -DskipTests
💡
-DskipTests跳过测试,如果你的项目有测试并且你信任它们,也可以去掉。
打包完成后,在 target/ 目录下会生成一个 xxx.jar 文件,一般是 30-50MB 左右。
这个 JAR 包含了所有依赖,可以直接用 java -jar 运行。
📤 第二步:上传到服务器
我用 scp 上传,一行命令搞定:
scp -i ~/.ssh/root.pem target/app.jar root@服务器IP:/opt/myapp/app.jar
上传到服务器的 /opt/myapp/ 目录。我习惯把每个项目放一个独立目录,方便管理。
🚀 第三步:启动 —— nohup + 日志重定向
最简单的启动方式:
nohup java -Dspring.profiles.active=prod -jar app.jar > app.log 2>&1 &
参数说明:
| 参数 | 作用 |
|---|---|
nohup |
退出终端后进程不结束 |
-Dspring.profiles.active=prod |
指定生产环境配置 |
> app.log |
日志输出到文件 |
2>&1 |
错误日志也输出到同一个文件 |
& |
后台运行 |
⚠️ 一个常见问题: 如果你第二次上传了 JAR,记得先
kill掉旧进程再启动,否则端口被占。
🔄 第四步:Nginx 反向代理
后端一般跑在非 80 端口(比如 8084),需要 Nginx 把域名请求转发过去。
server {
listen 443 ssl http2;
server_name doudouplay.cn;
location /api/ {
proxy_pass http://127.0.0.1:8084;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这样用户访问 https://doudouplay.cn/api/mini/login 时,Nginx 会把请求转发给 http://127.0.0.1:8084/api/mini/login。
配置改完后记得重载 Nginx:
nginx -t # 检查配置是否正确
nginx -s reload # 重载配置
📝 第五步:配置日志
开发时日志输出到控制台没问题,但线上必须写文件。Spring Boot 默认不配置日志文件路径,需要在 application-prod.yml 或 logback.xml 中配置。
我用的方案是 logback.xml,按天滚动,保留 30 天:
<configuration>
<property name="LOG_PATH" value="/var/log/service-log/myapp" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/service.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/service-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
</appender>
</configuration>
记得先 mkdir -p /var/log/service-log/myapp 建好目录,否则日志写不进去。
🛡️ 第六步:进程守护(可选)
nohup 启动的进程如果挂了不会自动重启。如果你的项目需要高可用,可以用 systemd 来管理:
[Unit]
Description=MyApp Backend
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Dspring.profiles.active=prod -jar /opt/myapp/app.jar
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
保存到 /etc/systemd/system/myapp.service,然后:
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
systemctl status myapp
这样进程挂了会自动重启,服务器重启也会自动启动。
✅ 总结
从本地到线上的完整流程:
核心要点:
- ✅
mvn package打包 →scp上传 →java -jar启动 - ✅ Nginx 反向代理,把域名指向后端端口
- ✅ 日志配置
logback.xml,按天滚动 - ✅ (可选)
systemd守护进程,挂了自动拉起
我的一纸云深小程序后端就是按这个流程上线的,目前稳定运行中。
如果这篇文章对你有帮助,欢迎点赞收藏,你的支持是我持续创作的动力!
关于作者:无羡,独立开发者,专注AI应用开发。
📌 分类:全栈开发
👉 关注我获取更多技术分享
👉 个人博客:云深不知处
👉 独立开发省钱攻略:查看详情
👉 体验我的AI产品:一纸云深
如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!
点击「阅读原文」查看我的独立开发笔记
更多推荐




所有评论(0)