首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS路由53 -到应用程序负载均衡器的不同端口的域名路由

问AWS路由53 -到应用程序负载均衡器的不同端口的域名路由
EN

Stack Overflow用户
提问于 2017-01-24 06:34:31
回答 2查看 8.2K关注 0票数 4

我们正在AWS中实现一种微服务架构。我们有几个EC2实例,其中的微服务部署在不同的端口上。我们还有一个面向应用程序负载均衡器的互联网,它根据端口将不同的服务路由到不同的服务。

代码语言:javascript
复制
eg: 
xxxx-xx.xx.elb.amazonaws.com:8080/ go to microservice 1 
xxxx-xx.xx.elb.amazonaws.com:8090/ go to microservice 2

我们需要有一个域名而不是ELB,端口不应该公开通过域名以及。几乎我找到的关于53号路由的所有资源都使用别名,它执行以下操作:

代码语言:javascript
复制
xx.xxxx.co.id -> xxxx-xx.xx.elb.amazonaws.com or
xx.xxxx.co.id -> 111.111.111.11 (static ip)

( 1)我们是否需要为每项微型服务提供不同的域名?

2)如何使用别名将域指向ELB的特定端口?

3)如果域来自AWS以外的其他提供者,是否可以使用此设置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-24 12:15:41

重要更新

由于这个答案是最初编写的,所以应用程序负载均衡器传入请求的标头。

现在可以使用传入的主机头将请求路由到特定的实例和端口。

此外,ALB引入SNI支持允许您将多个TLS (SSL)证书与单个均衡器相关联,并且在协商TLS时,将根据客户端提供的SNI自动选择正确的证书。来自的多域和通配符证书也可以用于ALB。

基于这些因素,不需要单独的端口或不同的侦听器--只需为每个服务分配主机名和/或路径前缀,并将这些模式映射到适当的实例目标组。

原来的答案不再准确,但如下所示。

1.)我们是否需要为每个微服务单独的域名?

不,这帮不了你。ALB不解释附加到传入请求的主机名。

同一域中单独的主机名也不能直接实现您的目标。

2.)如何使用别名将域指向ELB的特定端口?

域不指向端口。主机名不指向端口。DNS仅用于地址解析。互联网上的每一个地方都是如此。

3.)如果域来自AWS以外的其他提供程序,是否可以使用此设置。

这不是AWS的限制。DNS根本不是这样工作的。

服务端点不知道指向它的DNS记录。DNS条目本身严格用于发现可用于访问端点的IP地址。之后,端点实际上不知道任何关于DNS的信息,也无法通过DNS告诉浏览器使用不同的端口。

对于HTTP,隐式端口为80。对于HTTPS,是443。除非URL中提供了一个端口,否则这些端口是唯一可用的端口。

但是,在HTTP和HTTPS中,每个请求都带有一个Host:头,由web浏览器与每个请求一起发送。这是地址栏中的主机名。

为了区分到达设备(如ELB/ALB)的不同主机名的请求,端点上的设备必须解释传入主机头并将请求路由到提供该服务的后端系统。

ALB目前不支持此功能。

但是,ALB支持基于路径前缀选择端点。所以microservices.example.com/api/foo可以路由到一组服务,而microservices.example.com/api/bar可以路由到另一组服务。

但是ALB不直接支持主机头的路由。

在我的基础架构中,我们使用ELB或ALB的组合,但是负载均衡器背后的实例是而不是应用程序。相反,它们是运行HAProxy负载均衡器软件并将请求路由到后端的实例。

重要配置元素的一个简单示例如下所示:

代码语言:javascript
复制
frontend main
  use_backend svc1 if { hdr(Host) -i foo.example.com }
  use_backend svc2 if { hdr(Host) -i bar.example.com }

backend svc1
  server foo-a 192.168.2.24:8080
  server foo-b 192.168.12.18:8080

backend svc2
  ....

ELB终止SSL并随机选择代理,代理检查Host:头,并选择将请求路由到的后端(一组或多个实例)。它是ELB和应用程序之间的一个薄薄的层,它通过检查主机头或请求的任何其他特性来处理请求路由。

这是一种解决方案,但这是一种有点高级的配置,取决于您的专业知识。

如果您正在寻找一个开箱即用、无服务器、以AWS为中心的解决方案,那么答案实际上是在CloudFront中找到的。是的,它是一个CDN,但它还有其他几个应用程序,包括作为反向代理。

  • 对于每个服务,从域中选择一个主机名,将其分配给该服务,foo.api.example.com或bar.api.example.com。
  • 对于每个服务,创建一个CloudFront发行版。
  • 配置每个发行版的备用域名,以使用该服务的指定主机名。
  • 将原产地域名设置为ELB主机名。
  • 将原产地HTTP端口设置为ALB上服务的特定端口,例如8090。
  • 配置默认缓存行为以转发所需的任何标头。如果不需要CloudFront的缓存功能,请选择“转发所有头”。如果需要,还可以启用查询字符串和Cookies的转发。
  • 在53号路由中,创建foo.api.example.com作为特定CloudFront发行版主机名的别名,例如dxxxexample.cloudfront.net。

你的问题解决了。

你看到我在那做了什么吗?

对于您配置的每个主机名,一个专用的CloudFront发行版在标准端口(80/443)上接收请求,并且--基于哪个发行版与主机头匹配-- CloudFront将请求路由到相同的 ELB/ALB主机名,但使用自定义端口号。

票数 8
EN

Stack Overflow用户

发布于 2017-10-29 18:27:21

我认为他有可能建立他所描述的东西。我在同一条船上待了一段时间,这里有一些可供你考虑的选择:

  • 在R53中创建一个托管区域,并将您的域指向它。
  • 可选步骤:创建别名记录。您可以为每个子域或应用程序这样做。如果使用根域,则将别名字段保留为空。
  • 使用SLA选项创建一个记录集,这是一个用于端口重定向的服务查找。尝试将其指向您的LB端口80,别名子域。
  • 更改负载均衡器的侦听器,监听端口80 -然后根据应用程序端口设置重定向应用程序流量。

我没有使用SLA,但这肯定会指向那个方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41821505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档