在阿里云ECS上同时运行多个Spring Boot应用是常见需求。以下是详细的操作步骤和最佳实践:
1. 环境准备
安装Java环境
# 更新系统
sudo yum update -y
# 安装Java 8或11
sudo yum install java-11-openjdk-devel -y
# 验证安装
java -version
2. 应用部署方式
方式一:不同端口运行(推荐)
配置每个应用的端口
# application-service1.properties
server.port=8080
spring.application.name=service1
# application-service2.properties
server.port=8081
spring.application.name=service2
# application-service3.properties
server.port=8082
spring.application.name=service3
启动脚本示例
#!/bin/bash
# start-service1.sh
nohup java -jar /opt/apps/service1.jar
--spring.profiles.active=prod
--server.port=8080
> /var/log/service1.log 2>&1 &
echo "Service1 started on port 8080"
方式二:使用Docker容器化部署
Docker Compose配置
# docker-compose.yml
version: '3.8'
services:
service1:
image: your-registry/service1:latest
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
restart: unless-stopped
volumes:
- ./logs/service1:/app/logs
service2:
image: your-registry/service2:latest
ports:
- "8081:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
restart: unless-stopped
volumes:
- ./logs/service2:/app/logs
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- service1
- service2
3. 系统服务管理
创建systemd服务文件
service1.service
[Unit]
Description=Spring Boot Service 1
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/apps/service1
ExecStart=/usr/bin/java -jar /opt/apps/service1.jar --spring.profiles.active=prod
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=service1
[Install]
WantedBy=multi-user.target
服务管理命令
# 复制服务文件
sudo cp service1.service /etc/systemd/system/
sudo cp service2.service /etc/systemd/system/
# 重新加载systemd
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start service1
sudo systemctl start service2
# 设置开机自启
sudo systemctl enable service1
sudo systemctl enable service2
# 查看状态
sudo systemctl status service1
4. Nginx反向X_X配置
# /etc/nginx/conf.d/multiple-services.conf
upstream service1 {
server 127.0.0.1:8080;
}
upstream service2 {
server 127.0.0.1:8081;
}
server {
listen 80;
server_name service1.yourdomain.com;
location / {
proxy_pass http://service1;
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 service2.yourdomain.com;
location / {
proxy_pass http://service2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5. 资源监控与优化
JVM参数优化
# 根据内存分配合理的JVM参数
java -Xms512m -Xmx1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-jar your-app.jar
监控脚本
#!/bin/bash
# monitor-services.sh
echo "=== Service Status ==="
ps aux | grep java | grep -v grep
echo -e "n=== Memory Usage ==="
free -h
echo -e "n=== Disk Usage ==="
df -h
echo -e "n=== Active Connections ==="
netstat -tlnp | grep java
6. 安全配置
防火墙设置
# 开放必要端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8080-8089/tcp
sudo firewall-cmd --reload
用户权限管理
# 创建专用用户
sudo useradd -m -s /bin/bash appuser
sudo chown -R appuser:appuser /opt/apps
7. 日志管理
Logback配置示例
<!-- logback-spring.xml -->
<configuration>
<property name="LOG_PATH" value="/var/log/${spring.application.name}"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
8. 健康检查
创建健康检查脚本
#!/bin/bash
# health-check.sh
SERVICES=("http://localhost:8080/actuator/health"
"http://localhost:8081/actuator/health")
for url in "${SERVICES[@]}"; do
response=$(curl -s -o /dev/null -w "%{http_code}" $url)
if [ "$response" != "200" ]; then
echo "Service at $url is DOWN (HTTP $response)"
# 可以添加告警逻辑
else
echo "Service at $url is UP"
fi
done
最佳实践建议
- 资源规划:根据应用负载合理分配ECS实例规格
- 监控告警:配置云监控和告警规则
- 备份策略:定期备份应用和数据
- 安全加固:及时更新系统和应用
- 自动化部署:使用CI/CD工具进行部署
通过以上配置,你可以在阿里云ECS上稳定地运行多个Spring Boot应用。
云计算导航