走啊走
加油

如何在阿里云ECS上同时运行多个SpringBoot应用?

服务器价格表

在阿里云ECS上同时运行多个Spring Boot应用是完全可行的,以下是详细的步骤和最佳实践:

1. 环境准备

安装Java环境

# 更新系统
sudo yum update -y

# 安装OpenJDK(以Java 17为例)
sudo yum install -y java-17-openjdk-devel

# 验证安装
java -version

创建应用目录结构

# 创建应用主目录
sudo mkdir -p /opt/springboot-apps

# 为每个应用创建独立目录
sudo mkdir -p /opt/springboot-apps/app1
sudo mkdir -p /opt/springboot-apps/app2
sudo mkdir -p /opt/springboot-apps/app3

2. 配置不同端口

方法一:使用application.yml配置

# app1/application.yml
server:
  port: 8080
spring:
  application:
    name: app1-service

# app2/application.yml
server:
  port: 8081
spring:
  application:
    name: app2-service

# app3/application.yml
server:
  port: 8082
spring:
  application:
    name: app3-service

方法二:通过启动参数指定

# 启动时指定端口
java -jar app1.jar --server.port=8080
java -jar app2.jar --server.port=8081
java -jar app3.jar --server.port=8082

3. 使用Systemd管理服务

创建Systemd服务文件

# 创建app1服务
sudo tee /etc/systemd/system/app1.service << 'EOF'
[Unit]
Description=App1 Spring Boot Application
After=syslog.target

[Service]
User=root
Type=simple
ExecStart=/usr/bin/java -jar /opt/springboot-apps/app1/app1.jar --server.port=8080
Restart=always
RestartSec=10
SuccessExitStatus=143
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 创建app2服务
sudo tee /etc/systemd/system/app2.service << 'EOF'
[Unit]
Description=App2 Spring Boot Application
After=syslog.target

[Service]
User=root
Type=simple
ExecStart=/usr/bin/java -jar /opt/springboot-apps/app2/app2.jar --server.port=8081
Restart=always
RestartSec=10
SuccessExitStatus=143
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

启动和管理服务

# 重新加载systemd配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start app1.service
sudo systemctl start app2.service

# 设置开机自启
sudo systemctl enable app1.service
sudo systemctl enable app2.service

# 查看服务状态
sudo systemctl status app1.service
sudo systemctl status app2.service

# 停止服务
sudo systemctl stop app1.service

# 重启服务
sudo systemctl restart app1.service

4. 资源监控和优化

JVM参数优化

# 根据服务器内存调整JVM参数
ExecStart=/usr/bin/java 
  -Xms512m 
  -Xmx1024m 
  -XX:+UseG1GC 
  -jar /opt/springboot-apps/app1/app1.jar 
  --server.port=8080

监控命令

# 查看端口占用情况
netstat -tlnp | grep :808

# 查看Java进程
ps aux | grep java

# 查看系统资源使用
top
htop

5. Nginx反向X_X配置

安装Nginx

sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx

配置反向X_X

# /etc/nginx/conf.d/apps.conf
upstream app1 {
    server 127.0.0.1:8080;
}

upstream app2 {
    server 127.0.0.1:8081;
}

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

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

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

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

重载Nginx配置

sudo nginx -t
sudo systemctl reload nginx

6. 安全配置

防火墙设置

# 开放必要的端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=8081/tcp
sudo firewall-cmd --reload

文件权限设置

# 设置正确的文件权限
sudo chown -R root:root /opt/springboot-apps
sudo chmod 755 /opt/springboot-apps
sudo find /opt/springboot-apps -name "*.jar" -exec chmod 755 {} ;

7. 日志管理

配置日志轮转

# 创建日志目录
sudo mkdir -p /var/log/springboot

# 配置logrotate
sudo tee /etc/logrotate.d/springboot << 'EOF'
/var/log/springboot/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 root root
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
EOF

8. 健康检查脚本

#!/bin/bash
# health-check.sh
check_app() {
    local port=$1
    local app_name=$2

    if curl -s http://localhost:$port/actuator/health | grep -q '"status":"UP"'; then
        echo "$app_name is UP"
        return 0
    else
        echo "$app_name is DOWN"
        return 1
    fi
}

check_app 8080 "App1"
check_app 8081 "App2"

注意事项

  1. 端口冲突:确保每个应用使用不同的端口
  2. 内存分配:根据服务器总内存合理分配各应用的JVM内存
  3. 监控告警:设置适当的监控和告警机制
  4. 备份策略:定期备份应用和配置文件
  5. 安全更新:及时更新系统和应用的安全补丁

通过以上配置,你就可以在阿里云ECS上稳定地运行多个Spring Boot应用了。