宝塔面板部署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.skiptrue生成的jar包通常在target目录下名称类似demo-0.0.1-SNAPSHOT.jar。上传环节的注意事项不要直接扔到web目录建议创建专属目录如/home/javaapps用宝塔的文件功能上传时遇到大文件100MB可能会超时此时可以用SFTP工具上传后检查文件权限确保www用户有执行权限chmod 755 xxx.jar3. 端口配置躲开血泪教训的冲突问题去年有个项目死活起不来查日志发现是80端口被Nginx占了。后来我养成了部署前必做三件事在宝塔安全页面放行项目端口如8080用命令检查端口占用netstat -tlnp | grep 端口号如果要用80端口记得先停用Nginx/Apache典型端口冲突场景SpringBoot默认8080与Tomcat冲突80端口被Web服务器占用数据库3306端口未开放导致连接失败4. 项目启动三种保活方案实测对比第一次部署时用java -jar直接启动关掉SSH会话项目就挂了。后来测试了几种方案方案1nohup基础版适合快速测试nohup java -jar demo.jar log.txt 21 缺点日志文件会无限增大需要定期清理方案2screen会话可随时查看screen -S myapp java -jar demo.jar # 按CtrlA然后按D退出会话 # 恢复用 screen -r myapp方案3系统服务生产推荐 在/etc/systemd/system创建demo.service[Unit] DescriptionDemo SpringBoot App Aftersyslog.target [Service] Userwww ExecStart/usr/bin/java -jar /home/javaapps/demo.jar SuccessExitStatus143 [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl start demo systemctl enable demo5. 数据库配置从导入SQL到权限管理最惊险的一次是误操作把生产库覆盖了。现在数据库操作都遵循这个流程创建专用账号不要用rootCREATE 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 nameFILE classch.qos.logback.core.rolling.RollingFileAppender file/var/log/demo/app.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern/var/log/demo/app.%d{yyyy-MM-dd}.log/fileNamePattern maxHistory30/maxHistory /rollingPolicy /appender宝塔日志监控在计划任务添加日志切割设置异常关键词报警如ERROR/Exception临时调试tail -f /var/log/demo/app.log | grep --color -E ERROR|WARN8. 持续运行保障进程守护与自动重启经历过服务器内存泄漏导致项目崩溃现在必做这些防护措施方案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 21 echo $(date): 进程重启 /var/log/demo/monitor.log fi sleep 60 done内存限制建议 在启动命令中添加JVM参数防止OOMjava -Xms512m -Xmx1024m -XX:MaxMetaspaceSize256m -jar demo.jar