在同一个阿里云服务器上部署多个 Java Web 应用,核心思路是让每个应用监听不同的端口,并通过反向X_X(如 Nginx)统一对外提供访问。以下是完整、可落地的方案:
✅ 推荐架构
用户 → Nginx(80/443) → 反向X_X →
├─ /app1 → Tomcat1 (8080) / Spring Boot App1 (8081)
├─ /app2 → Tomcat2 (8082) / Spring Boot App2 (8083)
└─ /api → 微服务集群...
💡 优势:隔离性好、便于独立运维、支持不同 Java 版本、灵活扩展。
🛠️ 实施步骤(以 Spring Boot + Nginx 为例)
步骤 1:准备应用包
将每个应用打包为独立的 JAR/WAR:
# 示例结构
/app/
├── app1.jar # 默认端口 8081
├── app2.jar # 默认端口 8082
└── nginx.conf # 配置反向X_X
⚠️ 注意:确保每个应用的
server.port不同(可通过--server.port=8081或application.yml指定)。
步骤 2:启动多个 Java 应用(后台运行)
方式 A:使用 systemd(推荐,生产环境)
创建两个 service 文件:
/etc/systemd/system/app1.service
[Unit]
Description=App1 Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/apps
ExecStart=java -jar app1.jar --server.port=8081
Restart=always
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
[Install]
WantedBy=multi-user.target
/etc/systemd/system/app2.service
同上,修改 ExecStart 中的 jar 名和端口(如 8082)。
启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable app1 app2
sudo systemctl start app1 app2
sudo systemctl status app1 app2
方式 B:简单脚本启动(测试用)
nohup java -jar app1.jar --server.port=8081 > app1.log 2>&1 &
nohup java -jar app2.jar --server.port=8082 > app2.log 2>&1 &
步骤 3:安装并配置 Nginx 反向X_X
安装 Nginx:
sudo apt update && sudo apt install nginx -y # Ubuntu/Debian
# 或 yum install nginx -y # CentOS/RHEL
编辑 /etc/nginx/sites-available/default(或新建配置文件):
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或 IP
location /app1/ {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选:路径重写(去掉 /app1 前缀传给后端)
rewrite ^/app1/(.*)$ /$1 break;
}
location /app2/ {
proxy_pass http://127.0.0.1:8082/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/app2/(.*)$ /$1 break;
}
}
🔍 关键点:
rewrite用于去除路径前缀,避免后端收到/app1/login而期望/login- 若应用本身已处理上下文路径(如
spring.mvc.servlet.path=/app1),则无需 rewrite
测试配置:
sudo nginx -t
sudo systemctl reload nginx
步骤 4:开放安全组端口(阿里云控制台)
- 登录 阿里云 ECS 控制台
- 找到实例 → 安全组 → 规则
- 添加入方向规则:
- 协议:TCP
- 端口范围:
80,443(HTTP/HTTPS) - 授权对象:
0.0.0.0/0(或限制特定 IP)
❗ 不要直接开放 8081/8082!仅暴露 80/443,由 Nginx X_X内部端口。
步骤 5:验证访问
http://your-ip/app1/login→ 应路由到 port 8081 的 app1http://your-ip/app2/api/users→ 应路由到 port 8082 的 app2
检查日志确认转发正常:
tail -f /var/log/nginx/access.log
tail -f /opt/apps/app1.log
🌟 进阶优化建议
| 需求 | 方案 |
|---|---|
| HTTPS 加密 | 在 Nginx 配置 SSL(Let’s Encrypt 免费证书) |
| 多域名支持 | 添加多个 server {} 块,分别指向不同应用 |
| 容器化部署 | 改用 Docker Compose + Traefik/Nginx Proxy Manager |
| 统一日志监控 | 接入 ELK 或 Prometheus+Grafana |
| 健康检查 | Nginx 配置 health_check 或 Spring Actuator /actuator/health |
⚠️ 常见坑点提醒
- 端口冲突:启动前用
lsof -i :8081检查是否被占用。 - 防火墙干扰:确认
ufw或firewalld未拦截本地回环(通常不影响127.0.0.1)。 - 上下文路径不匹配:Spring Boot 默认根路径为
/,若前端硬编码了/app1/,需配合rewrite或调整server.servlet.context-path。 - 内存不足:多个 JVM 实例会叠加内存消耗,合理设置
-Xms/-Xmx,必要时升级配置或拆分到多台 ECS。
需要我为你提供:
- 完整的 Docker Compose 部署示例?
- Spring Boot 多环境配置模板?
- 一键部署 Shell 脚本?
欢迎告诉我你的具体技术栈(如是否用 Tomcat WAR、是否需 HTTPS),我可进一步定制方案!
云小栈