努力
加油

如何在阿里云ECS上同时运行两个Web服务?

在阿里云 ECS 上同时运行两个 Web 服务,核心逻辑其实非常简单:端口隔离 + 反向XX。

很多新手容易陷入一个误区,觉得需要两台服务器或者复杂的负载均衡才能跑多个站点。实际上,只要你的应用监听不同的端口,或者通过 Nginx/Apache 做域名分发,单机完全可以轻松搞定。

下面我按从“简单粗暴”到“生产规范”的三种常见场景给你拆解,你可以根据实际需求选。

方案一:直接监听不同端口(适合开发测试或内网使用)

这是最原始也最直接的方式。假设你要跑 app1 和 app2。

  1. 配置应用:

    • 让 app1 监听 8080 端口。
    • 让 app2 监听 8081 端口。
    • 注意:确保代码里写死的是 0.0.0.0:8080 而不是 127.0.0.1:8080,否则网络访问不到。
  2. 安全组放行:

    • 登录阿里云控制台 -> ECS实例 -> 安全组。
    • 添加入方向规则:允许 TCP 协议,端口范围填 8080/8080 和 8081/8081,授权对象填 0.0.0.0/0(或者指定 IP)。
  3. 访问方式:

    • http://<ECS公网IP>:8080
    • http://<ECS公网IP>:8081

缺点:体验极差,用户得记端口号,且无法使用 HTTPS(除非用证书绑定特定端口,但管理麻烦),不适合对外提供服务。


方案二:Nginx 反向XX + 域名区分(生产环境标准做法)

这是互联网行业最通用的做法。用户只关心域名(如 a.com 和 b.com),不关心后端跑了什么。Nginx 作为入口,根据域名把请求转发给不同的后端服务。

第一步:准备后端服务

假设你有两个 Node.js/Java/Python 应用,分别启动在本地回环地址的不同端口上:

  • 项目 A:http://127.0.0.1:3000
  • 项目 B:http://127.0.0.1:4000
  • 关键点:这里监听 127.0.0.1 是为了安全,不让外部直接访问后端端口,只允许 Nginx 访问。

第二步:安装并配置 Nginx

在 ECS 上安装 Nginx(以 CentOS 为例):

yum install nginx -y
systemctl start nginx
systemctl enable nginx

编辑配置文件 /etc/nginx/conf.d/default.conf(或者新建一个文件如 vhost.conf):

# 项目 A 的配置
server {
    listen 80;
    server_name a.yourdomain.com; # 替换为你的域名

    location / {
        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 的配置
server {
    listen 80;
    server_name b.yourdomain.com; # 替换为你的域名

    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

第三步:DNS 解析

去你的域名服务商(阿里云万网、腾讯云 DNSPod 等)那里:

  • 将 a.yourdomain.com 解析到这台 ECS 的公网 IP。
  • 将 b.yourdomain.com 解析到同一台 ECS 的公网 IP。

第四步:重启 Nginx

nginx -t  # 检查配置语法
systemctl reload nginx

现在,访问 a.yourdomain.com 就会看到项目 A,访问 b.yourdomain.com 看到项目 B。


方案三:同域名不同路径(适合微服务或前后端分离)

如果你只有一个域名,但想通过路径区分服务,比如 /api 走后端,/web 走前端静态资源。

server {
    listen 80;
    server_name www.yourdomain.com;

    # 前端静态页面
    location / {
        root /var/www/html/dist;
        index index.html;
    }

    # 后端 API 接口
    location /api/ {
        proxy_pass http://127.0.0.1:5000/; # 注意末尾斜杠的处理
        proxy_set_header Host $host;
    }
}

⚠️ 必须注意的几个坑(血泪经验)

  1. 端口冲突:
    确保你的两个 Web 服务没有监听同一个端口。如果都是 80 端口,第二个启动时会报错 Address already in use。

  2. 防火墙与安全组:

    • 系统防火墙:如果是 CentOS 7+,记得开 firewalld 或 ufw,放行 80 和 443 端口。
    • 阿里云安全组:这是最容易忘的!即使你在 Linux 内部开了 80 端口,如果阿里云控制台的安全组没开,网络还是连不上。务必检查安全组入方向规则。
  3. HTTPS 配置:
    现在不做 HTTPS 的网站很难受。你可以使用 Let’s Encrypt 的 certbot 工具一键申请免费 SSL 证书,并配置 Nginx 支持 HTTPS。对于单域名多服务,可以使用 SNI(Server Name Indication)技术,Nginx 完全支持。

  4. 进程守护:
    不要用 node app.js 这种前台启动方式,SSH 断开服务就挂了。

    • 推荐使用 pm2 (Node.js)、supervisor (Python)、systemd (通用) 来管理进程,保证服务崩溃后自动重启。
  5. 资源限制:
    一台 ECS 的资源是有限的。如果两个服务都很吃内存/CPU,记得监控一下。阿里云有云监控,可以设置报警阈值。如果负载过高,考虑升级配置或使用弹性伸缩(ESS)。

总结

  • 自己玩玩/内网调试:直接改端口,开安全组。
  • 正式对外服务:Nginx 反代 + 域名解析 + Systemd/Pm2 进程守护 + HTTPS。

这套组合拳在国内云计算环境下是最稳定、最易维护的方案。别整那些花里胡哨的容器编排(K8s/Docker Swarm),除非你真的需要高可用和自动化部署,否则对于单个 ECS 上的两个 Web 服务,Nginx 反代就是最优解。