别再复制粘贴了!手把手教你用腾讯云CentOS7.5部署Spring Boot项目(含MySQL8.0避坑指南)

发布时间:2026/6/10 21:56:53

别再复制粘贴了!手把手教你用腾讯云CentOS7.5部署Spring Boot项目(含MySQL8.0避坑指南) 腾讯云CentOS 7.5实战Spring Boot项目部署与MySQL 8.0深度调优指南开篇为什么你的Spring Boot项目总在部署时崩溃每次看到部署成功的截图就跃跃欲试结果自己操作时却卡在莫名其妙的错误上这可能是大多数Java开发者第一次接触服务器部署时的真实写照。不同于本地开发环境云服务器部署需要面对Linux系统管理、服务配置、网络策略等多维挑战而Spring Boot与MySQL 8.0的组合更是暗藏诸多新手杀手——从GPG密钥失效到密码策略冲突从防火墙配置到内存泄漏每个环节都可能成为项目上线的拦路虎。本文将基于腾讯云CentOS 7.5环境以实战角度演示一个博客系统的完整部署流程。不同于随处可见的复制粘贴式教程我们会重点剖析那些官方文档轻描淡写、但实际必踩的五个典型深坑并给出经过生产环境验证的解决方案。无论你是需要部署毕业设计的学生还是希望提升运维能力的初级开发者这份指南都能让你少走80%的弯路。1. 云服务器初始化避开选购与系统配置的隐藏陷阱1.1 腾讯云学生机选购指南腾讯云学生优惠套餐确实是性价比之选但需要注意三个关键点地域选择建议优先选择距离用户群体最近的地域如华南地区选广州延迟可降低30-50ms镜像版本CentOS 7.5与7.9是最稳定的选择避免使用CentOS 8已停止维护安全组配置初始设置必须放行以下端口端口号协议用途说明22TCPSSH远程连接80TCPHTTP访问443TCPHTTPS安全连接3306TCPMySQL数据库连接8080TCPSpring Boot应用注意购买完成后立即在控制台重置实例密码建议使用16位以上包含大小写字母、数字和特殊字符的组合1.2 SSH连接优化方案使用默认的SSH连接可能会遇到会话超时中断的问题推荐以下配置# 修改SSH配置文件 sudo vim /etc/ssh/sshd_config # 添加以下参数 ClientAliveInterval 60 ClientAliveCountMax 3 TCPKeepAlive yes # 重启SSH服务 sudo systemctl restart sshd同时建议为本机生成SSH密钥对实现免密登录# 本地终端执行非服务器 ssh-keygen -t rsa -b 4096 ssh-copy-id root你的服务器IP2. 环境部署JDK与Tomcat的高效配置方案2.1 JDK 11安装的现代方法传统教程建议手动下载tar包配置其实有更优雅的解决方案# 安装EPEL仓库 sudo yum install -y epel-release # 安装OpenJDK 11 sudo yum install -y java-11-openjdk-devel # 验证安装 java -version如果必须使用Oracle JDK需要注意license问题。以下是合规安装步骤# 下载rpm包需提前在Oracle官网同意协议 wget https://download.oracle.com/java/11/latest/jdk-11_linux-x64_bin.rpm # 安装 sudo rpm -ivh jdk-11_linux-x64_bin.rpm # 设置系统默认JDK sudo alternatives --config java2.2 Tomcat 9优化配置不建议使用yum安装的Tomcat推荐手动安装最新版# 下载解压 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz tar -xzf apache-tomcat-9.0.68.tar.gz -C /usr/local/ # 创建专用用户 sudo useradd -r -s /bin/false tomcat sudo chown -R tomcat:tomcat /usr/local/apache-tomcat-9.0.68关键配置调整内存设置在/usr/local/apache-tomcat-9.0.68/bin/setenv.sh中添加export CATALINA_OPTS-server -Xms512m -Xmx1024m -XX:MaxMetaspaceSize256m线程池优化修改conf/server.xml的Connector配置Connector port8080 protocolHTTP/1.1 maxThreads200 minSpareThreads20 acceptCount100 connectionTimeout20000 redirectPort8443 /日志切割配置conf/logging.properties使用每日滚动日志3. MySQL 8.0部署与深度调优3.1 解决GPG密钥过期问题MySQL官方源的GPG密钥经常过期这是第一个大坑。正确的安装流程# 移除旧密钥 sudo rpm -e gpg-pubkey --allmatches # 导入新密钥 sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 # 安装MySQL 8.0社区版 sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm sudo yum install -y mysql-community-server3.2 密码策略与远程访问配置MySQL 8.0默认启用caching_sha2_password认证插件会导致许多客户端工具连接失败。完整配置流程# 启动服务 sudo systemctl start mysqld # 获取临时密码 sudo grep temporary password /var/log/mysqld.log # 安全初始化 sudo mysql_secure_installation进入MySQL后执行以下关键操作-- 修改密码策略生产环境慎用 SET GLOBAL validate_password.policyLOW; -- 创建专用数据库用户 CREATE USER blog_user% IDENTIFIED BY Complex_Password_123!; GRANT ALL PRIVILEGES ON blog_db.* TO blog_user%; -- 修改root用户认证方式 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY NewRootPassword123!; -- 刷新权限 FLUSH PRIVILEGES;3.3 性能优化配置编辑/etc/my.cnf添加以下参数[mysqld] # 基础配置 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock # 内存配置 innodb_buffer_pool_size 256M innodb_log_file_size 128M key_buffer_size 64M # 连接配置 max_connections 100 wait_timeout 600 interactive_timeout 600 # 其他优化 innodb_flush_log_at_trx_commit 2 sync_binlog 10004. Spring Boot应用部署实战4.1 项目打包的进阶技巧避免简单的mvn package推荐使用分层构建build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration layers enabledtrue/enabled /layers /configuration /plugin /plugins /build打包命令mvn clean package -DskipTests4.2 生产级启动方案不要直接使用java -jar推荐使用systemd服务管理创建/etc/systemd/system/blog.service[Unit] DescriptionBlog Application Aftersyslog.target network.target mysqld.service [Service] Usertomcat WorkingDirectory/opt/blog ExecStart/usr/bin/java -Xms256m -Xmx512m -jar /opt/blog/blog-0.0.1-SNAPSHOT.jar SuccessExitStatus143 Restartalways RestartSec30 [Install] WantedBymulti-user.target管理命令# 重载配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start blog # 查看日志 journalctl -u blog -f4.3 Nginx反向代理配置在/etc/nginx/conf.d/blog.conf中添加server { listen 80; server_name yourdomain.com; 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; } access_log /var/log/nginx/blog_access.log; error_log /var/log/nginx/blog_error.log; }5. 五大必坑场景与救火方案5.1 案例MySQL连接池耗尽现象应用运行一段时间后出现HikariPool-1 - Connection is not available错误解决方案检查连接泄漏SHOW STATUS LIKE Threads_connected;调整连接池配置spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.leak-detection-threshold50005.2 案例OOM内存溢出现象服务突然崩溃日志中出现java.lang.OutOfMemoryError排查步骤生成内存快照jmap -dump:formatb,fileheap.hprof pid使用Eclipse MAT分析内存泄漏点5.3 案例定时任务重复执行现象集群环境下定时任务在多节点重复执行解决方案Scheduled(cron 0 0/5 * * * ?) SchedulerLock(name reportGeneration, lockAtLeastFor 4m, lockAtMostFor 5m) public void generateReport() { // 方法实现 }需要引入net.javacrumbs.shedlock依赖5.4 案例文件上传权限问题现象上传的图片无法访问或服务无法写入目录解决方案# 创建专用存储目录 sudo mkdir -p /data/blog/uploads sudo chown -R tomcat:tomcat /data/blog sudo chmod -R 755 /data/blog在application.properties中配置spring.servlet.multipart.max-file-size10MB spring.servlet.multipart.max-request-size10MB file.upload-dir/data/blog/uploads5.5 案例第三方API证书问题现象调用HTTPS接口时出现PKIX path validation failed错误解决方案Configuration public class SSLConfig { Bean public RestTemplate restTemplate() throws Exception { SSLContext sslContext new SSLContextBuilder() .loadTrustMaterial(null, (certificate, authType) - true).build(); HttpClient client HttpClients.custom() .setSSLContext(sslContext) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(client)); } }

相关新闻