在一台服务器上运行多个 Spring Boot 项目是完全可行的,但需要根据资源情况、隔离需求和运维复杂度选择合适的部署方式。以下是常见的方案和注意事项:
1. 端口区分(最简单)
- 方式:每个项目使用不同的服务器端口(
server.port)。 - 示例:
- 项目A:
server.port=8080 - 项目B:
server.port=8081
- 项目A:
- 优点:无需额外配置,适合少量项目。
- 缺点:
- 需通过不同端口访问(如
http://IP:8080、http://IP:8081)。 - 缺乏统一入口,需手动管理端口冲突。
- 需通过不同端口访问(如
2. 反向X_X(推荐)
通过 Nginx/Apache 等反向X_X工具,将不同域名或路径映射到多个 Spring Boot 项目。
方案A:基于域名
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://localhost:8080; # 转发到项目A
}
}
server {
listen 80;
server_name app2.example.com;
location / {
proxy_pass http://localhost:8081; # 转发到项目B
}
}
- 优点:通过域名区分项目,用户无感知端口。
- 适用场景:有独立域名且需 HTTPS(可配合 Let’s Encrypt)。
方案B:基于路径
location /app1/ {
proxy_pass http://localhost:8080/; # 注意末尾的斜杠
}
location /app2/ {
proxy_pass http://localhost:8081/;
}
- 优点:单域名多项目。
- 注意:需确保 Spring Boot 项目支持上下文路径(如
server.servlet.context-path=/app1)。
3. 容器化部署(Docker)
- 方式:每个项目打包为独立容器,通过 Docker Compose 管理。
- 示例
docker-compose.yml:version: '3' services: app1: image: your-app1-image ports: - "8080:8080" app2: image: your-app2-image ports: - "8081:8080" - 优点:
- 环境隔离,依赖独立。
- 方便扩展和迁移。
- 工具扩展:结合 Kubernetes 更适用于大规模部署。
4. 进程管理(Systemd/PM2)
- 方式:用工具管理多个 Java 进程。
-
示例 Systemd 单元文件:
# /etc/systemd/system/app1.service [Unit] Description=Spring Boot App1 After=network.target [Service] ExecStart=/usr/bin/java -jar /path/to/app1.jar User=www-data Restart=always [Install] WantedBy=multi-user.target - 优点:自动化进程监控和重启。
- 缺点:需手动处理日志和资源竞争。
关键注意事项
- 资源分配:
- 监控 CPU/内存(如
top,htop),避免资源耗尽。 - 可设置 JVM 参数限制内存(如
-Xmx512m)。
- 监控 CPU/内存(如
- 日志管理:
- 每个项目配置独立的日志文件(如 Logback 的
logback-spring.xml)。
- 每个项目配置独立的日志文件(如 Logback 的
- 配置文件隔离:
- 使用不同 Profile(
spring.profiles.active=prod)或外部化配置。
- 使用不同 Profile(
- 端口冲突:
- 确保端口无冲突(
netstat -tulnp | grep LISTEN)。
- 确保端口无冲突(
- 安全:
- 反向X_X可隐藏内部端口,同时配置防火墙(如
ufw/iptables)。
- 反向X_X可隐藏内部端口,同时配置防火墙(如
总结建议
- 少量项目:直接改端口 + Nginx 反向X_X。
- 复杂环境:Docker 容器化 + 反向X_X。
- 高可用需求:考虑 Kubernetes 集群部署。
根据实际场景选择最适合的方案,平衡易用性、隔离性和资源开销。
云服务器