在单个 EC2 实例上托管多个 API 并通过使用 HTTPS 的子域访问它们

问题描述

我正在尝试在 AWS 上托管我的整个产品组合,其中包含 5 个 React + Node.js 应用程序(包括产品组合本身)。对于每个项目,我都在 S3 上托管前端并使用 CloudFront 分发将它们置于前端。我已经设置了要从 Route53 自定义域提供的投资组合,我将调用 mydomain.com,该域通过 ACM SSL 证书具有 HTTPS。其他应用程序可以使用其存储桶中的网站端点。我希望所有应用程序的前端都通过调用 https://api.mydomain.com:${APP_PORT}/${ROUTE} 与 EC2 实例交互,其中 APP_PORT 是所需 API 运行的任何端口。我已经在我的实例上安装了 Node.js,克隆了 2 个存储库,并使用 PM2 启动了应用程序。每个应用程序在 / 处侦听 get 请求并返回 ${APP_NAME} API working properly。一个在端口 5000 上运行,另一个在 5001 上运行。我在附加到实例的安全组中有以下入站规则:

类型 协议 端口范围 来源
HTTP TCP 80 0.0.0.0/0
HTTP TCP 80 ::/0
SSH TCP 22 0.0.0.0/0
SSH TCP 22 ::/0
自定义 TCP TCP 5000 0.0.0.0/0
自定义 TCP TCP 5000 ::/0
HTTPS TCP 443 0.0.0.0/0
HTTPS TCP 443 ::/0
自定义 TCP TCP 5001 0.0.0.0/0
自定义 TCP TCP 5001 ::/0

目前,我可以通过实例的公共 IPv4 DNS 和端口调用每个 API,因此 http://ec2-012-34-56-789.compute-1.amazonaws.com:5000/http://ec2-012-34-56-789.compute-1.amazonaws.com:5001/ 可以工作。我想让它与 https://api.mydomain.com... 一起工作。从我所见,我应该使用应用程序负载均衡器,然后在我的 Route53 托管区域上创建 A 记录。

这就是我被卡住的地方。

我使用面向内部的方案、IPv4 IP 地址类型和以下侦听器创建了一个应用程序负载平衡器:

负载均衡器协议 负载均衡器端口
HTTP 80
HTTPS 443
HTTPS 5000
HTTPS 5001

我保留默认 VPC 并检查所有可用区。在安全设置中,我选择我的 ACM 证书,它涵盖 mydomain.comwww.mydomain.com*.mydomain.com。默认安全策略 (ELBSecurityPolicy-2016-08)。接下来,安全组与我用于我的实例的相同。这就是我认为我犯了错误的地方:我创建了一个新的目标组类型实例、协议 HTTP 和版本 HTTP1,以及端口 80。健康检查是通过 HTTP 在 / 执行的。我注册我的实例并点击创建。

我在 Route53 上为 api.mydomain.com 创建了一条 A 记录,并将其作为指向应用程序负载均衡器的别名。目标组完成健康检查并显示不健康。 HTTP 获取对负载均衡器 DNS 名称或 api.mydomain.com 的请求,后跟任一端口显示 400 The plain HTTP request was sent to HTTPS port。 HTTPS 请求分别显示 Error: Hostname/IP does not match certificate's altnames...502 Bad Gateway

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)