【问题标题】:Is it possible to run multiple web instance in the same AWS EC2?是否可以在同一个 AWS EC2 中运行多个 Web 实例?
【发布时间】:2020-05-30 11:17:49
【问题描述】:

背景

我按照本教程https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cli-tutorial-ec2.html,编写了一个 docker compose 文件,创建了一个网站 A(由 4 个容器组成)并运行为我的一个客户端提供服务。

但是,现在我有另一个客户,我需要使用与上述类似的策略来托管另一个网站 B。

这里是ECS/EC2当前运行的服务

这里是容器启动并运行,现在服务于网站 A

问题和疑虑

  1. 网站 A 现在位于我唯一集群下 EC2 中的一项服务中,我可以使用相同的 EC2 实例并运行网站 B(作为 EC2 的另一项服务)吗?
  2. 如果是这样,如何管理端口/入站/出站流量?现在A网站已经占用了EC2实例的80、443、27017和3002端口用于入站流量,如果B网站的容器也运行在同一个EC2实例中,我还可以为B网站使用80、443、27017和3002端口吗?已阅读 ALB (Amazon Load Balancer) 的文档,似乎可以满足要求,我是否走在正确的轨道上?
  3. 还有域名,通过路由53,我注册了一个域名www.websiteA.com来服务第一个网站,我还注册了另一个www.websiteB.com准备服务网站B,我猜我需要配置指向同一个 EC2 IP 的新域 B?
  4. 我在部署B网站的过程中,不想影响A网站的可用性,可以在部署B网站的容器的过程中维护吗?

我想在开始部署网站B之前清除所有概念,感谢您的帮助,谢谢

后续行动

我决定使用 AWS 应用程序负载均衡器来解决我的问题,并进行以下配置设置。

我首先研究负载均衡器

并配置如下

我设置了一个负载均衡器,它使用传入端口 80 的 HTTP 协议侦听请求,只要有用户访问 Web 服务器(即:前端容器),侦听器就会将该请求转发到目标组(即:http-端口 80 访问)

这是包含注册目标(当前运行容器的我的 ec2 实例)的目标组(http-port-80-access),容器的主机端口是 32849,而相关的负载均衡器(web -access-load-balancer) 用于动态端口映射。

我还在默认规则之上又配置了 1 条规则,每当用户访问 websiteA 的 url 时,负载均衡器都会将请求转发到目标组(http-port-80-access)。

一切就绪,健康测试也通过了。然后,我使用以下ecs-cli compose service up 命令将负载均衡器与服务连接起来

ecs-cli compose --file ./docker-compose-aws-prod.yml --cluster my-ecs-cluster-name --ecs-profile my-ecs-profile --cluster-config my-cluster --project-name my-project --ecs-params ./ecs-params.yml service up --target-group-arn arn:aws:elasticloadbalancing:us-east-2:xxxxxxxxx:targetgroup/http-port-80-access/xxxxxxxx --container-name frontend --container-port 80

其中frontend是网站A的前端容器的服务名称

但是,当我通过浏览器访问 www.websiteA.com 时,除了 ERR_CONNECTION_REFUSED 之外什么都没有,访问 www.websiteA.com:32849 确实可以访问,但这不是我想要的。

我在想是哪部分配置错了

【问题讨论】:

  • 流量如何路由到您的容器?你是直接去EC2实例的IP吗?你在使用 ALB 吗?
  • 你可以考虑使用virtual hosts
  • @JasonWadsworth 是的,用户目前正在通过域名网站A(通过EC2实例的直接IP)访问网站A。而且我还没有使用 ALB,因为我不知道 ALB 是正确的选择
  • @JohnRotenstein 是的,我在搜索过程中还发现虚拟主机是解决方案之一,但在我的情况下应该如何实现呢? AFAIK,我应该在网站 A 和网站 B 之前构建具有虚拟主机设置的服务器,将 EC2 IP 映射到该服务器以通过虚拟主机配置路由到不同的容器?换句话说,我需要创建另一个 docker 容器(可能是 nginx 服务器)来接收请求,配置虚拟主机并将 EC2 IP 定向到 nginx 服务器?

标签: amazon-web-services docker amazon-ec2 amazon-ecs


【解决方案1】:

如果您将流量直接发送到实例,那么您必须在不同的端口上托管。您应该考虑使用 ALB,它允许您使用 dynamic ports in ECS。 ALB 可以接受来自不同域的端口 80 和 443 的流量,并根据域等内容将流量路由到不同的容器。

【讨论】:

  • 谢谢!通过托管在不同的端口上,这意味着我的 docker-compose 端口映射不应再次映射到网站 B 的端口 80/443?或者我仍然可以在撰写文件的端口映射中使用它并使用 ALB 来处理流量路由? (因为我希望这两个站点都可以通过 80/443 访问)
  • 在容器内它可以使用任何你想要的端口。那是任务定义中的“容器端口”。
  • 谢谢杰森。如果我理解正确的话,内部通信的容器端口可以保持不变,但主机的映射端口不能是80?假设我的网站 A 已经为“端口映射”配置了 80:80,对于网站 B,(主机部分的)端口映射不能使用端口 80,例如应该使用 81:80?
  • 当您使用动态端口映射时,您不指定主机端口,只指定内部端口。
  • 对于无 http 流量,您需要使用 NLB。
【解决方案2】:

网站 A 现在位于我唯一集群下的 EC2 中的一项服务中,我可以使用相同的 EC2 实例并运行网站 B(作为 EC2 的另一项服务)吗?

确实如此。但是 - 正如您已经发现的那样,您必须根据某些内容(主机名、路径、..)来拆分流量。这就是反向代理发挥作用的地方(托管 - ALB、NLB 或您自己的 - nginx、haproxy、..)。

简单的http流量(基于主机)

如果是这样,如何管理端口/入站/出站流量?现在A网站已经占用了EC2实例的80、443、27017和3002端口用于入站流量,如果B网站的容器也运行在同一个EC2实例中,我还能用80、443、27017和3002端口给B网站吗。

假设端口 27017 和 3002 使用自己的二进制协议(不是 http)。你会处理的。

您理论上可以定义端口映射(将不同的公共侦听端口映射到这些自定义端口),但是您需要使用 NLB(网络负载平衡器)或在主机公共 IP 上公开端口。在后一种情况下,我不确定 ECS 是否可以保证使用哪个 IP(例如,拥有多个工作节点)

我已经阅读了 ALB (Amazon Load Balancer) 的文档,似乎可以满足要求,我是否走在正确的轨道上?

ALB 是第 7 层反向代理 (http),恕我直言,它是 Web 访问的最佳选择,而不是二进制协议。

,我想我需要配置指向同一个EC2 IP的新域B?

这就是计划

我在部署B网站的过程中,不想影响A网站的可用性,可以在部署B网站的容器的过程中维护吗?

应该没问题

【讨论】:

  • 感谢 gusto,我更清楚下一步该做什么了。但就我而言,由于我需要 web 协议和二进制协议动态端口绑定,我想我需要应用程序负载平衡器和网络负载平衡器?正如文档所述,网络负载均衡器位于第 4 层 (TCP/IP),我认为它符合我在处理 27017 和 3002 外部流量方面的需求?
  • @user2361494 是的,就是这样。但是 - 每个负载均衡器都需要花费一些东西。我会尝试为托管(额外的 pod)反向代理(例如 nginx 或 haproxy)创建单个 NLB,您可以使用它们来为 Web 部件提供服务。
  • 谢谢,我研究了几个小时的 ALB 配置,但似乎无法使所需的部署工作,我已经更新了原始线程上的后续操作以说明
【解决方案3】:

在不同的端口上运行网站 B。要允许最终用户在不指定端口号的情况下与网站 B 交互,请使用反向代理。请参阅 AWS CloudFront。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2012-09-24
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多