首页 > 解决方案 > 在单个 EC2 实例上托管多个 API,并通过具有 HTTPS 的子域访问它们

问题描述

我正在尝试在 AWS 上托管我的整个产品组合,其中包括 5 个 React + Node.js 应用程序(包括产品组合本身)。对于每个项目,我将前端托管在 S3 上,并在前端使用 CloudFront 分配。我已将投资组合设置为从我将调用的 Route53 自定义域提供服务,该域mydomain.com通过 ACM SSL 证书具有 HTTPS。其他应用程序可以使用其存储桶中的网站端点。我希望所有应用程序的前端通过调用与 EC2 实例交互,所需的 API 运行在哪个端口https://api.mydomain.com:${APP_PORT}/${ROUTE}APP_PORT我已经在我的实例上安装了 Node.js,克隆了 2 个 repos,并使用 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 at 执行的/。我注册我的实例并单击创建。

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

标签: amazon-web-serviceshttpamazon-ec2aws-acm

解决方案


推荐阅读