在阿里云 ECS(Elastic Compute Service)上部署多个 Spring Boot 项目是完全可行的,以下是详细的部署方案和最佳实践:
✅ 一、部署方式选择
方式1:单台 ECS 部署多个 Spring Boot 项目(共用服务器)
- 适用场景:测试环境、小流量项目、资源有限。
- 优点:成本低,部署简单。
- 缺点:资源竞争、端口冲突、一个项目崩溃可能影响其他项目。
方式2:多台 ECS 分别部署(隔离部署)
- 适用场景:生产环境、高可用、高并发。
- 优点:隔离性好,便于监控和维护。
- 缺点:成本较高。
推荐方式:使用 Docker + Nginx + ECS(混合部署)
✅ 二、单台 ECS 部署多个 Spring Boot 项目(推荐 Docker)
1. 准备工作
- 购买并登录 ECS(建议 CentOS 7+/Ubuntu 20.04+)
- 安装 Java、Docker、Docker Compose
# 安装 Docker
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 构建每个 Spring Boot 项目为独立 Docker 镜像
在每个 Spring Boot 项目根目录下创建 Dockerfile:
# Dockerfile
FROM openjdk:17-jdk-slim
COPY target/your-app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
构建镜像:
mvn clean package
docker build -t springboot-app1 .
重复此步骤为每个项目构建独立镜像(如 springboot-app2, springboot-app3)。
3. 使用 Docker Compose 统一管理多个服务
创建 docker-compose.yml:
version: '3.8'
services:
app1:
image: springboot-app1
container_name: app1
ports:
- "8081:8080"
environment:
- SERVER_PORT=8080
restart: unless-stopped
app2:
image: springboot-app2
container_name: app2
ports:
- "8082:8080"
environment:
- SERVER_PORT=8080
restart: unless-stopped
app3:
image: springboot-app3
container_name: app3
ports:
- "8083:8080"
environment:
- SERVER_PORT=8080
restart: unless-stopped
注意:每个容器映射不同宿主机端口(8081、8082、8083),避免冲突。
启动所有服务:
docker-compose up -d
查看运行状态:
docker-compose ps
4. 使用 Nginx 做反向X_X(可选,推荐)
安装 Nginx:
sudo yum install -y nginx
sudo systemctl start nginx
配置 Nginx 虚拟主机(/etc/nginx/conf.d/apps.conf):
server {
listen 80;
server_name app1.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name app2.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重启 Nginx:
sudo nginx -t
sudo systemctl reload nginx
然后通过域名访问不同项目。
✅ 三、JAR 直接运行(不推荐用于生产)
如果你不想用 Docker,也可以直接运行 JAR 包:
nohup java -jar app1.jar --server.port=8081 > app1.log 2>&1 &
nohup java -jar app2.jar --server.port=8082 > app2.log 2>&1 &
建议使用
systemd或supervisor管理进程。
✅ 四、注意事项
- 端口冲突:确保每个 Spring Boot 项目使用不同端口。
- JVM 资源:限制每个应用的内存(如
-Xmx512m),防止 OOM。 - 日志管理:将日志输出到文件,并定期轮转。
- 健康监控:集成 Actuator,便于监控。
- 安全组:在阿里云控制台开放所需端口(如 80, 443, 8081-8083)。
- 域名与 HTTPS:使用 Nginx + Let’s Encrypt 配置 SSL。
✅ 五、进阶建议(生产环境)
| 方案 | 说明 |
|---|---|
| Kubernetes + ECS | 多项目容器编排,自动扩缩容 |
| ECS + SLB + 多实例 | 负载均衡,高可用 |
| 云效 + CI/CD | 自动打包部署 |
✅ 六、总结
| 部署方式 | 适合场景 | 推荐度 |
|---|---|---|
| 多 JAR 直接运行 | 测试、学习 | ⭐⭐ |
| Docker Compose | 多项目共存 | ⭐⭐⭐⭐ |
| Nginx 反向X_X | 域名访问 | ⭐⭐⭐⭐⭐ |
| Kubernetes | 大型生产环境 | ⭐⭐⭐⭐⭐ |
如果你提供具体需求(如:是否需要域名、是否生产环境、项目数量),我可以给出更定制化的部署脚本或架构图。
CLOUD云