加油
努力

如何在同一个云服务器上部署两个不同的应用?

在同一个云服务器上部署两个不同的应用是完全可行且常见的做法。核心思路是:通过端口隔离、域名路由或容器化技术实现多应用共存。以下是几种主流方案及操作要点:


✅ 方案一:使用不同端口 + Nginx 反向X_X(推荐,简单高效)

适用场景:两个应用均为 Web 服务(如 Node.js、Python Flask/Django、Java Spring Boot 等)

步骤:

  1. 启动两个应用监听不同端口

    • 应用 A:http://localhost:3000
    • 应用 B:http://localhost:8080
  2. 安装并配置 Nginx(作为统一入口)

    sudo apt update && sudo apt install nginx -y  # Ubuntu/Debian
    # 或
    sudo yum install nginx -y                    # CentOS/RHEL
  3. 创建 Nginx 配置文件 /etc/nginx/sites-available/multi-app

    server {
       listen 80;
       server_name example.com www.example.com;
    
       # 应用 A:访问 /app-a 或子域名 a.example.com
       location /app-a/ {
           proxy_pass http://127.0.0.1:3000/;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
    
       # 应用 B:访问 /app-b 或子域名 b.example.com
       location /app-b/ {
           proxy_pass http://127.0.0.1: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;
       }
    
       # 可选:用子域名区分
       # server_name a.example.com;
       # location / { proxy_pass http://127.0.0.1:3000; }
    }
  4. 启用配置并重启 Nginx

    sudo ln -s /etc/nginx/sites-available/multi-app /etc/nginx/sites-enabled/
    sudo nginx -t          # 测试配置
    sudo systemctl restart nginx
  5. 开放防火墙端口(仅允许 80/443)

    sudo ufw allow 'Nginx Full'
    # 或手动放行
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload

✅ 优势:轻量、灵活、支持 HTTPS、易于扩展
🔒 建议:后续可结合 Let’s Encrypt 自动申请 SSL 证书


✅ 方案二:Docker 容器化部署(隔离性强,便于管理)

适用场景:应用依赖复杂、需环境隔离、希望快速迁移

示例:

# 构建并运行应用 A
docker run -d --name app-a -p 3000:3000 your-image-a

# 构建并运行应用 B
docker run -d --name app-b -p 8080:8080 your-image-b

再通过 Nginx 反向X_X(同上)统一暴露 80 端口,或直接让外部通过 http://ip:3000 / http://ip:8080 访问。

💡 进阶:使用 docker-compose.yml 统一管理:

version: '3'
services:
  app-a:
    build: ./app-a
    ports: ["3000:3000"]
    networks: [frontend]

  app-b:
    build: ./app-b
    ports: ["8080:8080"]
    networks: [frontend]

  nginx:
    image: nginx:alpine
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on: [app-a, app-b]
    networks: [frontend]

networks:
  frontend:

✅ 方案三:进程守护 + systemd 服务(生产环境推荐)

为避免应用崩溃后无法自动重启,将每个应用注册为独立 systemd 服务:

示例:/etc/systemd/system/app-a.service

[Unit]
Description=Application A
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/app-a
ExecStart=/usr/bin/node index.js
Restart=always
Environment="NODE_ENV=production"

[Install]
WantedBy=multi-user.target

激活:

sudo systemctl daemon-reload
sudo systemctl enable app-a
sudo systemctl start app-a

对应用 B 同理创建 app-b.service


🔐 安全与运维建议

项目 建议
权限控制 避免以 root 运行应用;使用专用用户(如 www-data, appuser
日志管理 配置 journald 或 rsyslog 集中收集日志;可用 journalctl -u app-a 查看
监控告警 集成 Prometheus + Grafana 监控 CPU/内存/请求延迟
备份策略 定期备份代码、数据库、配置文件(如用 borg 或云厂商快照)
DDoS 防护 前端加 Cloudflare 或 WAF 层,限制单 IP 频率

🚫 不推荐的做法

  • ❌ 两个应用同时监听 80 端口(除非用高级负载均衡器)
  • ❌ 硬编码 IP 地址(应使用域名 + DNS 解析)
  • ❌ 无防火墙规则直接开放所有端口

需要我根据你的具体技术栈(例如:一个 Python Django + 一个 Go 微服务?或一个 Vue 前端 + 一个 Java 后端?)提供定制化部署脚本吗?欢迎补充细节 😊

云服务器