在阿里云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"
注意事项
- 端口冲突:确保每个应用使用不同的端口
- 内存分配:根据服务器总内存合理分配各应用的JVM内存
- 监控告警:设置适当的监控和告警机制
- 备份策略:定期备份应用和配置文件
- 安全更新:及时更新系统和应用的安全补丁
通过以上配置,你就可以在阿里云ECS上稳定地运行多个Spring Boot应用了。
CLOUD云计算