当前位置: 首页 > news >正文

宝塔面板部署SpringBoot项目:从零到上线的保姆级避坑指南

1. 环境准备:从零搭建SpringBoot部署基础

第一次用宝塔部署SpringBoot项目时,我在JDK版本上栽过跟头。当时装完JDK 11兴冲冲上传jar包,结果控制台报了一堆不兼容错误,折腾半天才发现项目用的是JDK 8。所以环境配置这一步,建议大家先做好功课。

安装宝塔面板其实比想象中简单。在服务器终端执行以下命令(以CentOS为例):

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

安装完成后会显示面板地址和初始账号密码,记得保存到记事本。首次登录需要绑定宝塔账号,没有的话注册一个就行。

Java环境配置是第一个关键点:

  • 进入软件商店搜索"JDK",建议选择与开发环境一致的版本(推荐OpenJDK 1.8或11)
  • 同时安装MySQL(版本需与项目配置文件中的一致)
  • 如果项目用到Redis或Nginx,也建议提前装好

注意:遇到过有同学在MySQL安装时设置了复杂密码,但忘记修改项目的application.yml配置,导致后面连不上数据库。建议先用简单密码测试,部署成功后再修改。

2. 项目打包与上传:避开配置文件的那些坑

有次我打包时没注意,把本地的测试数据库配置打进了jar包,结果上线后疯狂连我本地MySQL。现在打包前都会三步检查:

  1. 确认application.yml/properties中的数据库连接信息
  2. 检查server.port是否与计划开放的端口一致
  3. 移除不必要devtools依赖(曾导致内存泄漏)

打包命令推荐用Maven纯净打包:

mvn clean package -Dmaven.test.skip=true

生成的jar包通常在target目录下,名称类似demo-0.0.1-SNAPSHOT.jar。

上传环节的注意事项:

  • 不要直接扔到web目录!建议创建专属目录如/home/javaapps
  • 用宝塔的"文件"功能上传时,遇到大文件(>100MB)可能会超时,此时可以用SFTP工具
  • 上传后检查文件权限,确保www用户有执行权限(chmod 755 xxx.jar)

3. 端口配置:躲开血泪教训的冲突问题

去年有个项目死活起不来,查日志发现是80端口被Nginx占了。后来我养成了部署前必做三件事:

  1. 在宝塔"安全"页面放行项目端口(如8080)
  2. 用命令检查端口占用:
netstat -tlnp | grep 端口号
  1. 如果要用80端口,记得先停用Nginx/Apache

典型端口冲突场景

  • SpringBoot默认8080与Tomcat冲突
  • 80端口被Web服务器占用
  • 数据库3306端口未开放导致连接失败

4. 项目启动:三种保活方案实测对比

第一次部署时用java -jar直接启动,关掉SSH会话项目就挂了。后来测试了几种方案:

方案1:nohup基础版(适合快速测试)

nohup java -jar demo.jar > log.txt 2>&1 &

缺点:日志文件会无限增大,需要定期清理

方案2:screen会话(可随时查看)

screen -S myapp java -jar demo.jar # 按Ctrl+A然后按D退出会话 # 恢复用 screen -r myapp

方案3:系统服务(生产推荐) 在/etc/systemd/system创建demo.service:

[Unit] Description=Demo SpringBoot App After=syslog.target [Service] User=www ExecStart=/usr/bin/java -jar /home/javaapps/demo.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target

然后执行:

systemctl daemon-reload systemctl start demo systemctl enable demo

5. 数据库配置:从导入SQL到权限管理

最惊险的一次是误操作把生产库覆盖了。现在数据库操作都遵循这个流程:

  1. 创建专用账号(不要用root!)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'ComplexPwd123!'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';
  1. 导入SQL文件的避坑指南:
  • 先用phpMyAdmin检查SQL文件编码(遇到过UTF8-BOM导致导入失败)
  • 大型SQL文件建议用命令行导入:
mysql -u root -p appdb < backup.sql
  1. 远程连接配置
  • 宝塔MySQL默认只允许本地连接
  • 需要修改MySQL配置文件的bind-address为0.0.0.0
  • 开放服务器安全组的3306端口

6. 反向代理配置:HTTPS与域名绑定

给SpringBoot配置SSL证书时,发现直接用内嵌Tomcat做HTTPS性能不如Nginx反向代理。推荐配置:

Nginx配置示例

server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /www/server/panel/vhost/cert/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

常见问题排查

  • 502错误:检查SpringBoot是否正常运行
  • 静态资源404:确认Nginx和SpringBoot的静态路径配置
  • HTTPS混合内容:确保前端代码中使用//代替http://

7. 日志管理:线上问题的侦探工具

曾经有个接口半夜报错,第二天查日志才发现被轮询覆盖了。现在我的日志方案:

  1. 日志分割(通过logback-spring.xml配置):
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/var/log/demo/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/var/log/demo/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender>
  1. 宝塔日志监控
  • 在"计划任务"添加日志切割
  • 设置异常关键词报警(如ERROR/Exception)
  1. 临时调试
tail -f /var/log/demo/app.log | grep --color -E 'ERROR|WARN'

8. 持续运行保障:进程守护与自动重启

经历过服务器内存泄漏导致项目崩溃,现在必做这些防护措施:

方案1:宝塔内置守护(最简单)

  1. 在"软件商店"安装"进程守护管理器"
  2. 添加守护进程:
    • 进程路径:/usr/bin/java
    • 启动参数:-jar /home/javaapps/demo.jar

方案2:脚本监控(更灵活)

#!/bin/bash while true do if ! pgrep -f "demo.jar" > /dev/null then nohup java -jar /home/javaapps/demo.jar >> /var/log/demo/restart.log 2>&1 & echo "$(date): 进程重启" >> /var/log/demo/monitor.log fi sleep 60 done

内存限制建议: 在启动命令中添加JVM参数防止OOM:

java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -jar demo.jar
http://www.jsqmd.com/news/1134549/

相关文章:

  • Linux Swap 分区实战:CentOS 7.6 下 3 种方法动态调整 1-8GB 交换空间
  • YouTransfer安全加固实战:TLS加密、访问控制与Docker部署全解析
  • Excel 2021 + BAT 批处理:3步实现千级文件批量重命名与格式转换
  • 京东开源JoyAI-VL-Interaction:全栈实时视频视觉语言交互模型部署指南
  • 如何让旧系统焕发新生:Blender 3.x+ Windows 7兼容方案终极指南
  • APK Messenger v4.3 实战:5分钟完成微信APK基础信息与权限风险分析
  • Wig/BigWig 格式实战:3步从BAM文件生成UCSC基因组浏览器轨迹
  • SpringBoot+Vue高校毕业生就业平台毕设实战:从环境搭建到核心功能实现
  • C++和C中const的区别详解
  • 3款主流SAR舰船检测数据集对比:LS-SSDD-v1.0 vs SSDD vs RSDD-SAR 核心差异与应用选型
  • Linux 进程管理实战:kill -9 与 kill -15 的 3 种场景选择与僵尸进程规避
  • Flask 后端时间处理 3 大场景:datetime、字符串、时间戳与SQL查询实战
  • 详解C++ cout格式化输出完全攻略
  • 手机ROM剩余空间不多时无法查阅和编写短信
  • Windows与Mac系统锁屏密码重置全攻略
  • Excel 2021 + BAT 批处理:3步实现千个文件按规则批量重命名
  • 将 Windows PC 作为网络文件共享(SMB)服务器 V2.1—— 局域网内高速传文件
  • AI设计新范式:用HTML替代Figma,构建可交互网页原型
  • COCOMO II 模型实战:3步估算软件项目工作量,误差控制在15%以内
  • SpringBoot 3 + Vue 3 前后端分离博客系统:从零搭建到部署完整指南
  • 老旧Mac系统重生指南:突破官方限制的硬件兼容方案
  • Windows 11 右键菜单修复:3种方法恢复被折叠的 Git Bash Here 选项
  • 三重降压转换器TPS65263设计与应用全解析
  • 安卓逆向实战:从加壳特征识别到Frida动态脱壳与签名算法还原
  • SpringBoot+Vue高校毕业生就业平台:从零搭建到部署的全栈毕设实战
  • GitLab Webhook 安全配置实战:签名令牌 vs 秘密令牌,3步防重放攻击
  • Codex Skills 安装与配置指南:10个必备技能提升开发效率
  • Servlet 3.0 与 JSP 2.3 实战:5分钟构建一个带登录验证的简易留言板
  • Spring Boot+Vue课程作业管理系统毕业设计实战指南
  • 作为程序员的求职,我想还是有些职业的特殊性的。程序员职业和一般的职业有很大的不同,程序员职业有其鲜明的特点::1、个人劳动 2、产品可复制。这两个特点注定了程序员有很大个人发展的空间。