在一台阿里云服务器上部署两个 Spring Boot 项目是常见需求,关键在于合理规划资源、端口、进程管理与安全隔离。以下是最佳实践,帮助你高效、稳定、安全地运行多个 Spring Boot 应用。
✅ 一、环境准备
1. 选择合适的 ECS 实例
- 推荐:2核4G 或以上(根据应用负载调整)
- 系统:CentOS 7+/Ubuntu 20.04+
- 安全组:开放必要的端口(如 80, 443, 自定义服务端口等)
✅ 二、部署方式建议
方案一:独立 Jar 包 + 不同端口(推荐)
每个 Spring Boot 项目打包为独立的 jar 文件,通过不同端口运行。
示例配置:
| 项目 | 端口 | 配置文件 |
|---|---|---|
| 项目A | 8080 | application.yml 中 server.port=8080 |
| 项目B | 8081 | application.yml 中 server.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 &
⚠️ 建议使用
systemd或supervisor管理进程(见下文)。
✅ 三、进程管理(推荐使用 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 收集日志
✅ 七、安全建议
- 关闭不必要的端口:仅开放 80/443 和 SSH
- 使用防火墙(firewalld/iptables)限制访问
- 禁止 root 登录 SSH,使用普通用户 + sudo
- 定期更新系统和 Java
- 使用 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云枢