news 2026/6/10 21:56:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再复制粘贴了!手把手教你用腾讯云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@你的服务器IP

2. 环境部署: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 java

2.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

关键配置调整:

  1. 内存设置:在/usr/local/apache-tomcat-9.0.68/bin/setenv.sh中添加:
    export CATALINA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
  2. 线程池优化:修改conf/server.xml的Connector配置:
    <Connector port="8080" protocol="HTTP/1.1" maxThreads="200" minSpareThreads="20" acceptCount="100" connectionTimeout="20000" redirectPort="8443" />
  3. 日志切割:配置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-server

3.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.policy=LOW; -- 创建专用数据库用户 CREATE USER 'blog_user'@'%' IDENTIFIED BY 'Complex_Password_123!'; GRANT ALL PRIVILEGES ON blog_db.* TO 'blog_user'@'%'; -- 修改root用户认证方式 ALTER USER 'root'@'localhost' 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 = 1000

4. Spring Boot应用部署实战

4.1 项目打包的进阶技巧

避免简单的mvn package,推荐使用分层构建:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build>

打包命令:

mvn clean package -DskipTests

4.2 生产级启动方案

不要直接使用java -jar,推荐使用systemd服务管理:

创建/etc/systemd/system/blog.service

[Unit] Description=Blog Application After=syslog.target network.target mysqld.service [Service] User=tomcat WorkingDirectory=/opt/blog ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/blog/blog-0.0.1-SNAPSHOT.jar SuccessExitStatus=143 Restart=always RestartSec=30 [Install] WantedBy=multi-user.target

管理命令:

# 重载配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start blog # 查看日志 journalctl -u blog -f

4.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"错误

解决方案

  1. 检查连接泄漏:
    SHOW STATUS LIKE 'Threads_connected';
  2. 调整连接池配置:
    spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.leak-detection-threshold=5000

5.2 案例:OOM内存溢出

现象:服务突然崩溃,日志中出现"java.lang.OutOfMemoryError"

排查步骤

  1. 生成内存快照:
    jmap -dump:format=b,file=heap.hprof <pid>
  2. 使用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-size=10MB spring.servlet.multipart.max-request-size=10MB file.upload-dir=/data/blog/uploads

5.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)); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 21:55:41

从OpenJudge一道题出发,聊聊C++里处理字符串输入的那些“坑”与技巧

从OpenJudge一道题出发&#xff0c;聊聊C里处理字符串输入的那些“坑”与技巧在C编程中&#xff0c;字符串输入看似简单&#xff0c;实则暗藏玄机。尤其是面对竞赛题目或实际项目中的复杂输入场景时&#xff0c;不少开发者都会在字符串处理上栽跟头。本文将以OpenJudge的一道典…

作者头像 李华
网站建设 2026/6/10 21:50:21

LLM工程落地周报:7篇高复现价值论文精析

1. 这份周度论文清单到底在解决什么问题&#xff1f;如果你每天刷arXiv、Hugging Face Papers、Twitter学术圈&#xff0c;很快就会发现一个现实&#xff1a;大模型领域的论文更新速度已经不是“日更”&#xff0c;而是“小时级爆发”。上周&#xff08;22/04–28/04&#xff0…

作者头像 李华