一台阿里云服务器部署两个SpringBoot项目的最佳实践?

在一台阿里云服务器上部署两个 Spring Boot 项目是常见需求,关键在于合理规划资源、端口、进程管理与安全隔离。以下是最佳实践,帮助你高效、稳定、安全地运行多个 Spring Boot 应用。


✅ 一、环境准备

1. 选择合适的 ECS 实例

  • 推荐:2核4G 或以上(根据应用负载调整)
  • 系统:CentOS 7+/Ubuntu 20.04+
  • 安全组:开放必要的端口(如 80, 443, 自定义服务端口等)

✅ 二、部署方式建议

方案一:独立 Jar 包 + 不同端口(推荐)

每个 Spring Boot 项目打包为独立的 jar 文件,通过不同端口运行。

示例配置:

项目 端口 配置文件
项目A 8080 application.ymlserver.port=8080
项目B 8081 application.ymlserver.port=8081

启动命令示例:

# 项目A
nohup java -jar /opt/app/app1.jar > /opt/logs/app1.log 2>&1 &

# 项目B
nohup java -jar /opt/app/app2.jar > /opt/logs/app2.log 2>&1 &

⚠️ 建议使用 systemdsupervisor 管理进程(见下文)。


✅ 三、进程管理(推荐使用 systemd)

避免使用 nohup 手动管理,推荐使用 systemd 实现开机自启、日志管理、自动重启。

创建 systemd 服务文件(以 app1 为例)

# /etc/systemd/system/app1.service
[Unit]
Description=Spring Boot App1
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/java -jar /opt/app/app1.jar
Restart=always
StandardOutput=journal
StandardError=journal
WorkingDirectory=/opt/app

[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reexec
systemctl enable app1.service
systemctl start app1.service
systemctl status app1.service

app2 创建类似的服务文件(端口和路径不同即可)。


✅ 四、反向X_X(Nginx 推荐)

使用 Nginx 统一对外暴露服务,实现域名分流或路径分流。

示例 Nginx 配置:

server {
    listen 80;
    server_name api.example.com;

    location /app1/ {
        proxy_pass http://localhost: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;
    }

    location /app2/ {
        proxy_pass http://localhost:8081/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

或使用不同子域名:

# app1.example.com → 8080
# app2.example.com → 8081

✅ 五、JVM 资源限制

避免单个应用耗尽内存,建议设置 JVM 参数:

-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m

例如启动命令:

java -Xms512m -Xmx1024m -jar app1.jar

总内存分配不超过物理内存的 70%,留出系统和 Nginx 使用空间。


✅ 六、日志管理

  • 每个项目独立日志目录:/opt/logs/app1/, /opt/logs/app2/
  • 使用 logback-spring.xml 配置滚动策略(按天/大小切割)
  • 可结合 logrotate 或 ELK 收集日志

✅ 七、安全建议

  1. 关闭不必要的端口:仅开放 80/443 和 SSH
  2. 使用防火墙(firewalld/iptables)限制访问
  3. 禁止 root 登录 SSH,使用普通用户 + sudo
  4. 定期更新系统和 Java
  5. 使用 Let’s Encrypt 配置 HTTPS

✅ 八、监控与运维

  • 使用 top, htop, jstat, jstack 监控资源
  • 部署 Prometheus + Grafana 监控 JVM 和系统指标
  • 设置健康检查接口 /actuator/health(需引入 spring-boot-starter-actuator)

✅ 九、可选:Docker 部署(进阶)

若未来可能扩展,建议使用 Docker 容器化:

# Dockerfile for app1
FROM openjdk:11-jre-slim
COPY app1.jar /app.jar
EXPOSE 8080
CMD ["java", "-jar", "/app.jar"]

使用 docker-compose.yml 管理多个服务:

version: '3'
services:
  app1:
    build: ./app1
    ports:
      - "8080:8080"
    restart: unless-stopped

  app2:
    build: ./app2
    ports:
      - "8081:8081"
    restart: unless-stopped

  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app1
      - app2

优点:环境隔离、易于迁移、版本控制清晰。


✅ 总结:最佳实践清单

项目 推荐做法
部署方式 独立 jar + 不同端口
进程管理 systemd 或 supervisor
外部访问 Nginx 反向X_X
端口规划 8080, 8081… 或统一走 80/443
JVM 内存 限制 -Xmx,避免 OOM
日志 独立目录 + 滚动策略
安全 防火墙 + HTTPS + 最小权限
扩展性 可考虑 Docker 化

如有更多需求(如高可用、负载均衡、数据库分离),可进一步拆分服务或升级架构。

需要我提供完整的 systemd 服务文件模板或 Nginx 配置样例吗?

未经允许不得转载:CLOUD云枢 » 一台阿里云服务器部署两个SpringBoot项目的最佳实践?