尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring Boot项目部署避坑实录:从本地打包到阿里云CentOS7上线,我遇到的5个‘坑’和解决方案

Spring Boot项目部署避坑实录:从本地打包到阿里云CentOS7上线,我遇到的5个‘坑’和解决方案 Spring Boot项目部署避坑实录从本地打包到阿里云CentOS7上线实战指南第一次将Spring Boot项目部署到阿里云服务器时那种既兴奋又忐忑的心情至今记忆犹新。作为从开发转向部署的新手本以为按照教程一步步操作就能顺利完成没想到从打包到上线的每个环节都暗藏玄机。这篇文章不是又一篇基础部署教程而是聚焦那些教程里不会告诉你的坑——那些只有在深夜调试时才会遇到的诡异报错那些让项目卡在99%进度的配置细节。如果你正在为jar包无法后台运行、数据库连接莫名失败、端口死活不通等问题抓狂这里记录的5个典型问题及解决方案或许能让你少走弯路。1. 环境准备阶段的版本匹配陷阱1.1 JDK版本的地雷在本地开发时使用JDK 11而服务器默认安装的是OpenJDK 8这个差异导致项目启动时报出UnsupportedClassVersionError。更隐蔽的是当通过宝塔面板同时安装了多个Java版本时系统默认使用的可能不是你想要的版本。验证当前Java版本的命令java -version切换Java版本的配置方法以CentOS7为例# 查看已安装的Java版本 alternatives --config java # 设置全局JAVA_HOME环境变量 echo export JAVA_HOME/usr/lib/jvm/java-11-openjdk /etc/profile source /etc/profile1.2 数据库驱动的兼容性问题本地测试时使用的MySQL 8.0驱动而服务器安装的是MySQL 5.7这会导致连接失败并出现Public Key Retrieval is not allowed错误。解决方案是在连接字符串中添加参数spring.datasource.urljdbc:mysql://localhost:3306/dbname?useSSLfalseallowPublicKeyRetrievaltrue版本兼容性对照表组件本地环境服务器环境解决方案JDK118升级服务器JDK或降级项目MySQL驱动8.05.7添加连接参数Tomcat嵌入版独立版统一使用嵌入版2. 文件权限与目录结构的隐藏关卡2.1 Xftp上传后的权限问题通过Xftp上传的jar包默认权限通常是644这会导致运行时报Permission denied错误。需要在服务器上执行chmod 755 /home/your_project/your_app.jar更安全的做法是创建专用用户和用户组# 创建用户组 groupadd appgroup # 创建用户并加入组 useradd -g appgroup appuser # 更改文件所有者 chown -R appuser:appgroup /home/your_project2.2 配置文件路径的坑开发时习惯将application.properties放在src/main/resources下但部署时需要特别注意如果使用外部配置文件确保路径正确java -jar your_app.jar --spring.config.location/path/to/application.properties宝塔面板中的常见错误配置将配置文件放在/www/wwwroot目录下使用相对路径引用资源文件忘记给配置文件设置适当权限3. 网络与端口配置的连环套3.1 双重防火墙的迷惑行为阿里云的安全组和宝塔面板的防火墙都可能导致端口不通。需要双重检查阿里云安全组规则需放行端口宝塔面板的安全选项卡CentOS自带的firewalld或iptables快速检查端口是否开放# 查看已开放端口 firewall-cmd --list-ports # 临时开放端口重启后失效 firewall-cmd --zonepublic --add-port8080/tcp --permanent firewall-cmd --reload3.2 反向代理的配置玄机在宝塔面板中配置Nginx反向代理时常见的错误包括代理配置中的目标URL写成了localhost而不是127.0.0.1忘记关闭Nginx的默认80端口占用SSL证书配置与Spring Boot的server.ssl配置冲突正确的Nginx配置示例location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }4. 持久化运行的三大误区4.1 直接运行jar包的陷阱简单使用java -jar命令运行项目当关闭SSH会话时应用会终止。常见的解决方案对比方法优点缺点适用场景nohup简单日志管理不便临时测试screen可交互需要额外安装开发环境systemd专业稳定配置复杂生产环境推荐使用systemd服务创建/etc/systemd/system/yourapp.service[Unit] DescriptionYour Spring Boot App Aftersyslog.target [Service] Userappuser ExecStart/usr/bin/java -jar /home/your_project/your_app.jar SuccessExitStatus143 [Install] WantedBymulti-user.target4.2 内存管理的坑默认JVM参数可能导致内存溢出或浪费。建议根据服务器配置调整java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize256m -jar your_app.jar监控内存使用情况# 查看Java进程内存 top -p $(pgrep -f your_app.jar) # 生成内存快照需开启JMX jmap -heap pid5. 数据库连接的魔鬼细节5.1 时区不一致引发的问题服务器数据库默认时区与应用时区不一致会导致时间字段出现8小时偏差。解决方案修改MySQL全局时区SET GLOBAL time_zone 8:00;或者在连接字符串中指定spring.datasource.urljdbc:mysql://localhost:3306/dbname?serverTimezoneAsia/Shanghai5.2 连接池配置的坑默认的HikariCP配置在生产环境可能不够用建议调整spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000监控数据库连接状态# 查看MySQL连接数 mysqladmin -u root -p status在项目上线后的三个月里这些经验教训让我深刻体会到部署不是开发的终点而是另一个维度的开始。最难忘的是那个凌晨三点当发现Nginx配置中一个多余的斜杠导致整个项目无法访问时既想笑又想哭的复杂心情。现在回头看每个坑都是成长的垫脚石——它们教会我在下一个项目开始时就会考虑部署需求而不是等到最后一刻。
返回列表