加油
努力

如何在同一个阿里云服务器上部署多个Java Web应用?

在同一个阿里云服务器上部署多个 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=8081application.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:开放安全组端口(阿里云控制台)

  1. 登录 阿里云 ECS 控制台
  2. 找到实例 → 安全组 → 规则
  3. 添加入方向规则:
    • 协议: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 的 app1
  • http://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

⚠️ 常见坑点提醒

  1. 端口冲突:启动前用 lsof -i :8081 检查是否被占用。
  2. 防火墙干扰:确认 ufwfirewalld 未拦截本地回环(通常不影响 127.0.0.1)。
  3. 上下文路径不匹配:Spring Boot 默认根路径为 /,若前端硬编码了 /app1/,需配合 rewrite 或调整 server.servlet.context-path
  4. 内存不足:多个 JVM 实例会叠加内存消耗,合理设置 -Xms/-Xmx,必要时升级配置或拆分到多台 ECS。

需要我为你提供:

  • 完整的 Docker Compose 部署示例?
  • Spring Boot 多环境配置模板?
  • 一键部署 Shell 脚本?

欢迎告诉我你的具体技术栈(如是否用 Tomcat WAR、是否需 HTTPS),我可进一步定制方案!

云服务器