ecs部署多个springboot项目?

在阿里云 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 &

建议使用 systemdsupervisor 管理进程。


✅ 四、注意事项

  1. 端口冲突:确保每个 Spring Boot 项目使用不同端口。
  2. JVM 资源:限制每个应用的内存(如 -Xmx512m),防止 OOM。
  3. 日志管理:将日志输出到文件,并定期轮转。
  4. 健康监控:集成 Actuator,便于监控。
  5. 安全组:在阿里云控制台开放所需端口(如 80, 443, 8081-8083)。
  6. 域名与 HTTPS:使用 Nginx + Let’s Encrypt 配置 SSL。

✅ 五、进阶建议(生产环境)

方案 说明
Kubernetes + ECS 多项目容器编排,自动扩缩容
ECS + SLB + 多实例 负载均衡,高可用
云效 + CI/CD 自动打包部署

✅ 六、总结

部署方式 适合场景 推荐度
多 JAR 直接运行 测试、学习 ⭐⭐
Docker Compose 多项目共存 ⭐⭐⭐⭐
Nginx 反向X_X 域名访问 ⭐⭐⭐⭐⭐
Kubernetes 大型生产环境 ⭐⭐⭐⭐⭐

如果你提供具体需求(如:是否需要域名、是否生产环境、项目数量),我可以给出更定制化的部署脚本或架构图。