可以,两个 Java 项目完全可以部署在同一台云服务器上,只要做好端口、环境隔离和资源规划即可。以下是关键要点和常见做法:
✅ 核心前提
- 端口不冲突:每个 Java 应用必须监听不同的端口(如
8081、8082),避免绑定同一端口导致启动失败。 - JVM 资源可控:合理设置
-Xms/-Xmx,防止多个 JVM 实例争抢内存导致 OOM 或系统卡顿。 - 依赖隔离:避免共享类库冲突(尤其使用 Maven/Gradle 时,建议独立构建、独立部署)。
🔧 常见部署方案
| 方案 | 说明 | 适用场景 |
|---|---|---|
| 直接运行 JAR/WAR | 用 java -jar app1.jar --server.port=8081 和 java -jar app2.jar --server.port=8082 启动 |
小型项目、快速验证 |
| Systemd 服务管理 | 编写两个 .service 文件(如 app1.service / app2.service),通过 systemctl start app1 管理 |
生产环境推荐,支持自动重启、日志轮转 |
| Docker 容器化 | 为每个项目打独立镜像,用 docker run -p 8081:8080 ... 启动;或用 Docker Compose 编排 |
环境一致性好,便于扩展与迁移 |
| Nginx 反向X_X | 前端统一域名 + 路径转发:/api1 → http://localhost:8081/api2 → http://localhost:8082 |
对外暴露单一入口,隐藏内部端口细节 |
💡 示例(Systemd 配置片段):
# /etc/systemd/system/app1.service [Unit] Description=Project A After=network.target [Service] User=ubuntu WorkingDirectory=/opt/app1 ExecStart=/usr/bin/java -jar -Xmx512m app1.jar --server.port=8081 Restart=always [Install] WantedBy=multi-user.target
⚠️ 注意事项
- 安全组/防火墙:确保只开放必要端口(如 Nginx 的 80/443,内部端口可仅本地访问)。
- 日志分离:每个项目独立输出日志(如
logs/app1.log),避免混在一起难以排查。 - 监控告警:使用 Prometheus + Grafana 或云厂商监控工具,分别追踪各进程 CPU/内存/GC。
- 数据库连接池:若共用 DB,注意连接数上限(如 MySQL
max_connections),避免被占满。
🌰 实际案例参考
某公司一台 4 核 8G 服务器上同时运行:
- Spring Boot 后端(8081)+ Vue 静态资源(Nginx 托管)
- 另一个微服务(8082)+ Redis 缓存
→ 通过 Nginx 统一路由,总成本降低 60%,运维效率提升明显。
需要我帮你生成具体的 systemd 脚本、Dockerfile 或 Nginx 配置模板吗?
云小栈