宝塔面板部署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。现在打包前都会三步检查:
- 确认application.yml/properties中的数据库连接信息
- 检查server.port是否与计划开放的端口一致
- 移除不必要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占了。后来我养成了部署前必做三件事:
- 在宝塔"安全"页面放行项目端口(如8080)
- 用命令检查端口占用:
netstat -tlnp | grep 端口号- 如果要用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 demo5. 数据库配置:从导入SQL到权限管理
最惊险的一次是误操作把生产库覆盖了。现在数据库操作都遵循这个流程:
- 创建专用账号(不要用root!)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'ComplexPwd123!'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';- 导入SQL文件的避坑指南:
- 先用phpMyAdmin检查SQL文件编码(遇到过UTF8-BOM导致导入失败)
- 大型SQL文件建议用命令行导入:
mysql -u root -p appdb < backup.sql- 远程连接配置:
- 宝塔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. 日志管理:线上问题的侦探工具
曾经有个接口半夜报错,第二天查日志才发现被轮询覆盖了。现在我的日志方案:
- 日志分割(通过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>- 宝塔日志监控:
- 在"计划任务"添加日志切割
- 设置异常关键词报警(如ERROR/Exception)
- 临时调试:
tail -f /var/log/demo/app.log | grep --color -E 'ERROR|WARN'8. 持续运行保障:进程守护与自动重启
经历过服务器内存泄漏导致项目崩溃,现在必做这些防护措施:
方案1:宝塔内置守护(最简单)
- 在"软件商店"安装"进程守护管理器"
- 添加守护进程:
- 进程路径:/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