腾讯云CentOS7.5服务器Spring Boot项目全流程部署实战
在当今快速迭代的互联网开发中,将本地开发完成的Spring Boot项目部署到云端服务器是每位开发者必须掌握的技能。本文将带你从零开始,完整走通从项目打包到线上运行的全过程,特别针对腾讯云CentOS7.5环境进行优化,解决实际部署中的各种"坑点"。
1. 环境准备与服务器配置
部署Spring Boot项目前,确保服务器环境准备充分是关键。腾讯云CentOS7.5作为稳定可靠的Linux发行版,是Java项目部署的理想选择。
1.1 服务器基础配置
首先登录腾讯云控制台,在实例列表中找到你的云服务器公网IP。推荐使用SSH密钥对方式登录,安全性更高:
ssh -i your_key.pem root@your_server_ip
登录后,建议先执行系统更新:
yum update -y && yum upgrade -y
注意:生产环境建议创建普通用户而非直接使用root,可通过
adduser deploy
创建部署专用账户
1.2 JDK环境安装
Spring Boot项目需要Java运行环境,推荐安装与开发环境一致的JDK版本。以下是JDK11的安装步骤:
# 安装OpenJDK11
yum install -y java-11-openjdk-devel
# 验证安装
java -version
若需特定版本Oracle JDK,可手动下载rpm包安装:
wget https://download.oracle.com/java/11/latest/jdk-11_linux-x64_bin.rpm
rpm -ivh jdk-11_linux-x64_bin.rpm
配置环境变量:
echo 'export JAVA_HOME=/usr/java/jdk-11.0.xx' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
2. 项目打包与优化
2.1 Maven打包配置
在本地开发环境,确保pom.xml中包含Spring Boot Maven插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
执行打包命令:
mvn clean package -DskipTests
打包优化技巧 :
-
使用
-DskipTests跳过测试加快打包速度 -
生产环境建议添加
-Pprod使用生产环境配置 -
可执行jar包通常位于target目录下,命名格式为
项目名-版本号.jar
2.2 上传部署包到服务器
推荐使用scp命令直接上传,避免图形化工具依赖:
scp -i your_key.pem target/your-project.jar deploy@your_server_ip:/home/deploy
对于较大项目,可先压缩再上传:
tar -czvf project.tar.gz target/your-project.jar
scp -i your_key.pem project.tar.gz deploy@your_server_ip:/home/deploy
ssh deploy@your_server_ip "tar -xzvf /home/deploy/project.tar.gz -C /home/deploy"
3. 服务器端部署实战
3.1 基础启动与测试
最简单的启动方式:
java -jar your-project.jar
但这种前台运行方式在SSH断开后会终止进程。推荐使用nohup:
nohup java -jar your-project.jar > app.log 2>&1 &
关键参数说明 :
| 参数 | 作用 | 示例值 |
|---|---|---|
| -Dserver.port | 指定服务端口 | 8080 |
| -Dspring.profiles.active | 指定环境配置 | prod |
| -Xms | JVM初始堆大小 | 256m |
| -Xmx | JVM最大堆大小 | 1024m |
3.2 生产级部署方案
3.2.1 Systemd服务化管理
创建服务配置文件
/etc/systemd/system/your-service.service
:
[Unit]
Description=Your Spring Boot Application
After=syslog.target network.target
[Service]
User=deploy
ExecStart=/usr/bin/java -jar /home/deploy/your-project.jar
SuccessExitStatus=143
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
启用并启动服务:
systemctl daemon-reload
systemctl enable your-service
systemctl start your-service
3.2.2 日志管理配置
Spring Boot默认使用Logback,可在application.properties中配置:
logging.file.name=app.log
logging.file.max-size=10MB
logging.file.max-history=7
logging.level.root=INFO
logging.level.com.yourpackage=DEBUG
推荐使用logrotate进行日志轮转:
# /etc/logrotate.d/your-app
/home/deploy/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
4. 常见问题排查与优化
4.1 端口冲突解决
检查端口占用:
netstat -tulnp | grep :8080
若需修改Spring Boot端口,可通过以下任一方式:
-
启动参数:
java -jar your-app.jar --server.port=9090 -
配置文件:
application.properties中添加server.port=9090 -
环境变量:
export SERVER_PORT=9090
4.2 内存优化配置
根据服务器配置调整JVM参数:
java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -jar your-app.jar
内存配置参考表 :
| 服务器内存 | Xms | Xmx | 建议场景 |
|---|---|---|---|
| 1GB | 256m | 512m | 小型测试环境 |
| 2GB | 512m | 1536m | 中型应用 |
| 4GB+ | 1g | 3g | 生产环境 |
4.3 数据库连接配置
确保application-prod.properties中包含正确的生产数据库配置:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useSSL=false
spring.datasource.username=dbuser
spring.datasource.password=securepassword
spring.jpa.hibernate.ddl-auto=validate
重要:永远不要在版本控制中提交生产数据库密码,推荐使用环境变量或配置中心
5. 高级部署技巧
5.1 蓝绿部署方案
为实现零停机更新,可采用以下步骤:
- 新版本部署到不同端口(如8081)
- 配置Nginx进行流量切换:
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
- 通过API测试新版本
- 切换Nginx配置,将8081设为主节点
- 逐步停止旧版本
5.2 健康检查与监控
Spring Boot Actuator提供丰富的监控端点:
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always
配合Prometheus监控:
<!-- pom.xml添加依赖 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置application.properties:
management.metrics.export.prometheus.enabled=true
5.3 安全加固措施
- 禁用不必要的Actuator端点:
management.endpoints.web.exposure.exclude=env,beans
- 添加HTTP基本认证:
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests().anyRequest().authenticated()
.and().httpBasic();
}
}
- 配置服务器防火墙:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
6. 持续集成与自动化部署
6.1 GitHub Actions自动化
创建
.github/workflows/deploy.yml
:
name: Deploy to Tencent Cloud
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Deploy to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
source: "target/*.jar"
target: "/home/deploy"
- name: Restart Service
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
sudo systemctl restart your-service
6.2 使用Docker容器化部署
创建Dockerfile:
FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建并运行:
docker build -t your-app .
docker run -p 8080:8080 -d your-app
使用Docker Compose管理依赖:
version: '3'
services:
app:
image: your-app
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_DATABASE=appdb
7. 性能调优实战
7.1 JVM调优参数
生产环境推荐配置:
java -server \
-Xms2g -Xmx2g \
-XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:+HeapDumpOnOutOfMemoryError \
-jar your-app.jar
关键GC参数对比 :
| GC算法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Serial GC | 单核小内存 | 简单高效 | 停顿时间长 |
| Parallel GC | 多核CPU | 吞吐量高 | 内存占用大 |
| CMS GC | 低延迟需求 | 并发收集 | 内存碎片 |
| G1 GC | 大内存应用 | 可预测停顿 | 复杂配置 |
7.2 Tomcat优化(嵌入式)
在application.properties中配置:
server.tomcat.max-threads=200
server.tomcat.min-spare-threads=10
server.tomcat.accept-count=100
server.tomcat.connection-timeout=5000
server.tomcat.max-connections=10000
7.3 数据库连接池优化
HikariCP推荐配置:
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=5000
8. 备份与灾备方案
8.1 应用备份策略
- 定期备份应用jar包:
tar -czvf /backups/app_$(date +%Y%m%d).tar.gz /home/deploy/your-app.jar
- 使用cron定时任务:
# 每周日凌晨3点备份
0 3 * * 0 tar -czvf /backups/app_$(date +\%Y\%m\%d).tar.gz /home/deploy/your-app.jar
8.2 数据库备份方案
MySQL定期备份:
mysqldump -u root -p your_db > /backups/db_$(date +%Y%m%d).sql
配合cron实现自动化:
# 每天凌晨2点备份
0 2 * * * mysqldump -u root -pPassword your_db > /backups/db_$(date +\%Y\%m\%d).sql
8.3 全站快照策略
腾讯云控制台提供磁盘快照功能,建议:
- 每周执行一次系统盘快照
- 每天增量备份数据盘
- 重大更新前手动创建快照
# 通过CLI创建快照(需安装腾讯云CLI工具)
tccli cbs CreateSnapshot --DiskId disk-xxxx --SnapshotName "Before_Update_$(date +%Y%m%d)"
9. 安全防护进阶
9.1 SSL证书配置
使用Let's Encrypt免费证书:
yum install -y certbot
certbot certonly --standalone -d yourdomain.com
Spring Boot配置HTTPS:
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=yourpassword
9.2 防火墙深度配置
只开放必要端口:
firewall-cmd --permanent --add-port=22/tcp # SSH
firewall-cmd --permanent --add-port=443/tcp # HTTPS
firewall-cmd --permanent --add-port=80/tcp # HTTP
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --reload
9.3 入侵检测系统
安装fail2ban防止暴力破解:
yum install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
配置
/etc/fail2ban/jail.local
:
[sshd]
enabled = true
maxretry = 3
bantime = 1h
10. 成本优化技巧
10.1 资源监控与调整
使用腾讯云监控查看资源使用率:
# 安装云监控Agent
wget https://mirrors.tencent.com/install/monitor/linux_stable/tencentcloud_monitor_install.sh
chmod +x tencentcloud_monitor_install.sh
./tencentcloud_monitor_install.sh
资源调整建议 :
- CPU持续>70%超过1小时 → 考虑升级
- 内存使用<30%持续1周 → 考虑降配
- 带宽峰值<50% → 调整带宽计费模式
10.2 按量计费优化
- 非生产环境可设置定时开关机
- 利用竞价实例降低成本(适合可中断任务)
- 购买预留实例券获得长期折扣
10.3 日志与存储优化
- 设置日志自动清理:
find /var/log -name "*.log" -type f -mtime +7 -delete
- 使用OSS存储静态资源
- 启用腾讯云COS生命周期管理自动归档旧文件
11. 真实案例:博客系统部署实战
以典型Spring Boot博客系统为例,分享实际部署中的经验:
- 配置分离 :将敏感信息如数据库密码、API密钥等移至环境变量
- 静态资源处理 :使用Nginx直接服务静态文件,减轻Java应用负担
- 缓存配置 :集成Redis缓存热门文章和页面
- 搜索优化 :为Elasticsearch配置单独的内存分配
- 定时任务 :使用Spring Scheduler时注意线程池配置
// 示例:生产环境线程池配置
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("blog-scheduler-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
12. 故障应急手册
12.1 服务不可用排查流程
-
检查服务状态:
systemctl status your-service -
查看日志:
journalctl -u your-service -n 100 -f -
检查端口监听:
ss -tulnp | grep java -
验证数据库连接:
telnet db_host 3306 -
检查磁盘空间:
df -h和du -sh /path
12.2 常见错误解决方案
问题1 :端口冲突
-
解决方案:修改
server.port或终止占用进程
问题2 :内存溢出
- 解决方案:分析heap dump,调整Xmx参数
问题3 :数据库连接耗尽
- 解决方案:优化连接池配置,检查慢查询
问题4 :文件权限问题
-
解决方案:确保运行用户有读写权限:
chown -R deploy:deploy /path/to/app
12.3 回滚操作指南
-
停止当前服务:
systemctl stop your-service -
恢复备份jar包:
cp /backups/app_20230101.jar /home/deploy/ -
重启服务:
systemctl start your-service -
验证功能:
curl -I http://localhost:8080/health
13. 监控与告警体系
13.1 基础监控配置
-
系统级监控:
- CPU使用率
- 内存占用
- 磁盘I/O
- 网络流量
-
应用级监控:
- JVM内存
- GC频率
- 线程状态
- HTTP请求量
13.2 Prometheus+Grafana方案
部署Prometheus监控Spring Boot:
# prometheus.yml 配置示例
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['your-app:8080']
关键监控指标:
-
jvm_memory_used_bytes -
tomcat_threads_busy_threads -
http_server_requests_seconds_count -
process_cpu_usage
13.3 告警规则设置
示例告警规则:
groups:
- name: spring-alerts
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[1m]) / rate(http_server_requests_seconds_count[1m]) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "High error rate on {{ $labels.instance }}"
description: "Error rate is {{ $value }}"
14. 扩展与集群部署
14.1 负载均衡配置
使用Nginx作为负载均衡器:
upstream backend {
least_conn;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
14.2 分布式Session方案
- Spring Session + Redis:
<!-- pom.xml 添加依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
配置application.properties:
spring.session.store-type=redis
spring.redis.host=your-redis-host
14.3 配置中心集成
使用Nacos作为配置中心:
// 启动类添加注解
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
bootstrap.properties配置:
spring.application.name=your-app
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
15. 现代化部署演进
15.1 Kubernetes集群部署
创建Deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-app
spec:
replicas: 3
selector:
matchLabels:
app: your-app
template:
metadata:
labels:
app: your-app
spec:
containers:
- name: app
image: your-registry/your-app:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
15.2 Service Mesh集成
通过Istio实现高级流量管理:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: your-app
spec:
hosts:
- your-app.example.com
http:
- route:
- destination:
host: your-app
subset: v1
weight: 90
- destination:
host: your-app
subset: v2
weight: 10
15.3 Serverless方案
腾讯云Serverless部署:
# serverless.yml
component: springboot
name: your-app
inputs:
src: ./target/your-app.jar
region: ap-guangzhou
runtime: Java8
memorySize: 512
timeout: 10
environment:
variables:
SPRING_PROFILES_ACTIVE: prod
部署命令:
sls deploy
16. 开发与运维协作
16.1 标准化部署文档
建议包含以下内容:
- 服务器规格要求
- 依赖软件及版本
- 部署步骤checklist
- 健康检查API列表
- 监控指标说明
- 常见问题速查表
16.2 变更管理流程
- 预发布环境验证
- 变更窗口申请
- 分批次灰度发布
- 发布后监控
- 回滚预案准备
16.3 性能基准测试
使用JMeter进行压力测试:
jmeter -n -t your_test.jmx -l result.jtl
关键测试指标:
- 平均响应时间<500ms
- 错误率<0.1%
- 95线<1s
- 吞吐量>100rps
17. 前沿技术展望
17.1 GraalVM原生镜像
将Spring Boot编译为原生可执行文件:
native-image -jar your-app.jar \
-H:Name=your-app \
--initialize-at-build-time=org.springframework \
-J-Xmx6G
优势:
- 启动时间<100ms
- 内存占用减少2/3
- 无需JVM环境
17.2 服务网格优化
利用Linkerd实现零代码修改的微服务治理:
- 自动重试失败请求
- 智能负载均衡
- 透明TLS加密
- 细粒度流量控制
17.3 AI运维辅助
- 异常检测:自动识别异常模式
- 根因分析:智能定位问题源头
- 容量预测:基于历史数据预测资源需求
- 自愈系统:自动执行修复操作
18. 经验总结与最佳实践
经过多个项目的实战部署,总结出以下黄金法则:
- 环境一致性 :开发、测试、生产环境保持高度一致
- 配置外置 :所有环境相关配置通过外部化方式管理
- 健康检查 :实现完善的健康检查接口
- 优雅停机 :确保服务关闭时处理完现有请求
- 监控先行 :先搭建监控再上线服务
- 渐进式发布 :采用金丝雀发布降低风险
- 文档即代码 :将部署文档纳入版本控制
- 自动化一切 :减少人工操作带来的不确定性
// 示例:优雅停机处理
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> {
connector.setProperty("relaxedQueryChars", "|{}[]");
connector.setProperty("relaxedPathChars", "|{}[]");
});
factory.addConnectorCustomizers(new GracefulShutdown());
return factory;
}
private static class GracefulShutdown implements TomcatConnectorCustomizer {
private volatile Connector connector;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
public void pause() {
connector.pause();
connector.getProtocolHandler().getExecutor().shutdown();
}
}
457

被折叠的 条评论
为什么被折叠?



