1. 云服务器部署全流程概述
作为一名有多年云服务部署经验的开发者,我经常被问到如何将项目从本地开发环境顺利部署到云服务器上。今天我将分享一个完整的云服务器部署流程,涵盖从服务器选购到项目上线的全链路操作。
云服务器部署的核心价值在于:
- 让应用具备7x24小时在线服务能力
- 通过弹性伸缩应对流量波动
- 实现开发与生产环境的一致性
- 降低IT基础设施的运维成本
整个流程可以分为以下几个关键阶段:
- 云服务器选购与基础配置
- 开发环境准备与项目打包
- 服务部署与网络配置
- 容器化部署方案
- 自动化运维脚本编写
2. 云服务器选购指南
2.1 主流云服务商对比
目前国内主流的云服务提供商有阿里云和腾讯云,两者都提供完善的云计算产品线。以下是核心产品的对比:
| 特性 | 阿里云ECS | 腾讯云CVM |
|---|---|---|
| 计费方式 | 按量/包年包月 | 按量/包年包月 |
| 实例规格 | 通用型/计算型/内存型等 | 标准型/计算型/内存型等 |
| 最低配置价格 | 约60元/月起 | 约65元/月起 |
| 新用户优惠 | 首单1折起 | 首单1.5折起 |
| 内网带宽 | 最高25Gbps | 最高23Gbps |
| 快照功能 | 收费 | 免费额度50GB |
2.2 选购建议
对于个人开发者和小型项目,我推荐以下配置:
- CPU:2核(突发性能实例即可)
- 内存:4GB
- 系统盘:40-50GB SSD
- 带宽:3-5Mbps(可按需调整)
- 操作系统:CentOS 7.9或Ubuntu 20.04 LTS
注意:购买时选择离目标用户群体最近的区域,例如华南用户选择广州区域,华北用户选择北京区域。
2.3 安全组配置
安全组相当于云服务器的防火墙,需要预先配置好规则:
- 登录云控制台进入安全组管理
- 添加入站规则:
- SSH(22):仅对管理IP开放
- HTTP(80)/HTTPS(443):对所有IP开放
- 自定义应用端口:如SpringBoot的8001
3. 开发环境准备
3.1 JDK安装配置
推荐使用Zulu JDK,这是经过认证的OpenJDK发行版:
bash复制# 下载JDK21
wget https://cdn.azul.com/zulu/bin/zulu21.44.17-ca-jdk21.0.8-linux_x64.tar.gz
# 解压并配置环境变量
tar -xzf zulu21.44.17-ca-jdk21.0.8-linux_x64.tar.gz
mv zulu21.44.17-ca-jdk21.0.8-linux_x64 /opt/jdk21
echo 'export JAVA_HOME=/opt/jdk21
export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
3.2 Maven配置优化
修改settings.xml配置阿里云镜像加速:
xml复制<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
3.3 SpringBoot项目打包
确保pom.xml中包含打包插件:
xml复制<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包命令:
bash复制mvn clean package -Dmaven.test.skip=true
4. 服务部署实战
4.1 传统部署方式
4.1.1 前端部署(Nginx)
- 安装Nginx:
bash复制sudo yum install nginx -y
sudo systemctl start nginx
- 部署Vue项目:
bash复制# 将dist目录上传到Nginx默认目录
cp -r dist/* /usr/share/nginx/html/
# 修改Nginx配置
vim /etc/nginx/nginx.conf
4.1.2 后端部署
- 上传jar包并启动:
bash复制nohup java -jar xx-springboot-1.0-SNAPSHOT.jar > app.log 2>&1 &
- 跨域配置(SpringBoot):
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
4.2 容器化部署
4.2.1 Docker安装
bash复制# 安装依赖
sudo yum install -y yum-utils
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动服务
sudo systemctl start docker
4.2.2 构建Docker镜像
创建Dockerfile:
dockerfile复制FROM openjdk:21-jdk
COPY target/xx-springboot-1.0-SNAPSHOT.jar app.jar
EXPOSE 8001
ENTRYPOINT ["java","-jar","/app.jar"]
构建并运行:
bash复制docker build -t xx-springboot .
docker run -d -p 8001:8001 --name myapp xx-springboot
5. 运维优化方案
5.1 启动脚本
创建start.sh:
bash复制#!/bin/bash
JAR_NAME=$(ls *.jar|head -n1)
nohup java -jar $JAR_NAME > /dev/null 2>&1 &
5.2 日志管理
- 使用logrotate自动切割日志:
bash复制# /etc/logrotate.d/myapp
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
}
- 集成ELK栈进行日志分析(可选)
5.3 监控告警
- 基础监控(CPU/内存/磁盘):
bash复制# 安装node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
- 应用健康检查接口:
java复制@RestController
public class HealthController {
@GetMapping("/health")
public String health() {
return "UP";
}
}
6. 常见问题排查
6.1 端口无法访问
排查步骤:
- 检查服务是否运行:
ps -ef|grep java - 检查防火墙规则:
firewall-cmd --list-ports - 检查安全组配置
- 测试本地访问:
curl localhost:8001/health
6.2 内存溢出
解决方案:
- 调整JVM参数:
bash复制java -Xms512m -Xmx1024m -jar app.jar
- 添加OOM时heap dump:
bash复制-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
6.3 部署自动化建议
- 使用Jenkins CI/CD流水线
- 编写Ansible Playbook
- 采用GitOps工作流(如ArgoCD)
通过以上完整的部署流程,开发者可以快速将应用部署到云服务器并保持稳定运行。实际部署时,建议先在小规模环境验证,再逐步扩展到生产环境。