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.ymllogback.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产品:一纸云深

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

点击「阅读原文」查看我的独立开发笔记


👉 点击查看我的个人介绍

👉 点击查看我的小红书主页

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐