
1. 从零开始SpringBoot项目打包与上传第一次用宝塔部署SpringBoot项目时我对着满屏的Linux命令直发懵。后来发现其实用Maven打包宝塔可视化操作整个过程比想象中简单得多。先打开你的IDE在项目根目录执行这个命令mvn clean package -DskipTests打包完成后会在target目录生成jar文件名字通常类似myproject-0.0.1-SNAPSHOT.jar。这里有个坑要注意如果项目用了Thymeleaf等模板引擎记得检查application.properties里静态资源路径配置否则部署后可能出现404错误。通过宝塔面板的文件管理上传jar包时我习惯在/www/wwwroot下新建专属目录。比如创建/www/wwwroot/myproject把jar包和application-prod.yml配置文件一起放进去。用宝塔的终端执行nohup java -jar xxx.jar 时建议先运行chmod x xxx.jar给执行权限。2. 宝塔环境配置的三大关键步骤2.1 安装Nginx的正确姿势在宝塔的软件商店搜索Nginx时会发现有多个版本可选。我实测发现Nginx 1.22的性能比旧版提升明显特别是启用HTTP/2后。安装时记得勾选这些模块Brotli压缩提升传输效率PageSpeed自动优化静态资源SSL模块必须项安装完成后别急着配置先在终端执行nginx -t测试配置是否有效。曾经因为漏了这个步骤导致改了半天配置不生效。2.2 网站节点创建的细节陷阱创建站点时域名栏可以填IP但后期要改HTTPS的话还是建议用域名。有个容易忽略的地方在根目录设置时不要直接指向jar包所在目录应该单独创建web目录如/www/wwwroot/myproject/public否则Nginx的默认索引机制可能会暴露你的jar文件。2.3 反向代理的进阶配置在宝塔的网站设置里找到反向代理标签添加代理规则时要注意目标URL填http://127.0.0.1:你的SpringBoot端口发送域名建议填$host保持原始请求头高级配置里加上这些参数proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;这能解决SpringBoot获取不到真实IP的问题。我遇到过前端拿不到session的情况后来发现是漏了proxy_cookie_path / /;这个关键配置。3. HTTPS加密的实战指南3.1 证书申请的那些坑免费证书我试过Lets Encrypt和阿里云两种。宝塔内置的Lets Encrypt自动续签很方便但有时会验证失败。这时候需要检查域名解析是否生效确认80端口未被占用临时关闭Cloudflare等CDN的代理阿里云证书需要下载Nginx版本的包含两个文件.key和.pem。上传时注意.key文件是私钥绝不能泄露。有个同事误把.key文件提交到GitHub结果被挖矿程序盯上。3.2 强制HTTPS的最佳实践在宝塔的SSL配置页面开启强制HTTPS后还需要在Nginx配置里加入301跳转if ($scheme http) { return 301 https://$host$request_uri; }但更推荐的方式是在SpringBoot的application.yml中配置server: tomcat: remoteip: protocol-header: X-Forwarded-Proto forwarded-headers-strategy: framework这样能保证redirect也走HTTPS。曾经有个支付回调失败就是因为少了这个配置。4. 性能调优与安全加固4.1 Nginx性能调优参数在宝塔的Nginx配置文件中找到http块加入这些参数keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_comp_level 3; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript;对于SpringBoot项目特别重要的是调整proxy_read_timeout默认60秒可能导致长耗时请求超时。我部署报表系统时就遇到过导出Excel超时的问题。4.2 防火墙的双重防护宝塔自带的防火墙要放行SpringBoot端口但更安全的做法是在安全组里只开放80/443用Nginx的allow/deny限制管理接口IP配置Spring Security的CSRF防护有个客户的系统被暴力破解就是因为没限制/actuator端口的访问。建议生产环境一定要禁用这些端点management: endpoints: web: exposure: exclude: *4.3 日志监控的正确姿势宝塔的日志分析功能其实很强大我通常会在Nginx日志格式中添加$request_time字段配置SpringBoot的JSON日志输出用宝塔的计划任务做日志切割曾经通过分析Nginx的499错误日志发现是前端没处理pending请求就直接跳转导致的问题。现在我会在Nginx配置里特别关注这些参数log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for $request_time;5. 常见问题排错手册5.1 502 Bad Gateway排查流程遇到502错误时按这个顺序检查查看Nginx错误日志/www/wwwlogs/nginx_error.log确认SpringBoot是否正常运行ps -ef | grep java检查端口监听情况netstat -tunlp测试直接访问后端curl http://localhost:端口/health上周就遇到个典型案例用户上传了1GB文件导致Nginx缓存爆了。解决方法是在Nginx配置里调整client_max_body_size 100m; proxy_buffer_size 128k; proxy_buffers 4 256k;5.2 HTTPS混合内容问题当浏览器提示不安全内容时通常是因为页面内嵌了HTTP协议的静态资源Cookie没有设置Secure属性重定向循环最快的排查方式是Chrome开发者工具的Security面板。有个电商网站就是因为第三方统计代码用了HTTP导致Chrome屏蔽了支付接口。5.3 内存泄漏排查经验用宝塔的Java项目管理器部署时建议配置JVM参数-Xms256m -Xmx512m -XX:HeapDumpOnOutOfMemoryError当发现内存持续增长时用jstat -gcutil PID 1000 10观察GC情况生成堆转储文件jmap -dump:formatb,fileheap.hprof PID用Eclipse MAT工具分析曾经有个缓存穿透问题导致OOM后服务不可用。后来在SpringBoot中加了以下配置才解决spring: cache: caffeine: spec: maximumSize500,expireAfterWrite5m