46

我正在尝试在 Amazon Elastic Load Balancer 后面设置我的应用程序服务器。我正在考虑让一台服务器专用于旧版本,而所有其他服务器专用于新版本。我正在考虑使用路径参数中的版本 ID 来实现这一点

例如

当前版本(3.0):http ://example.com/APPNAME/service

旧版本(2.2):http ://example.com/APPNAME/v2.2/service

我想知道:

  1. ELB 是否有能力查看 HTTP 请求?
  2. ELB 可以根据 URL 路径参数重定向请求吗?
4

3 回答 3

53

2017-04-05 更新

在去年夏天推出具有基于路径的路由支持的新 Application Load Balancer 之后(请参阅之前的更新),AWS 现在还为 AWS Application Load Balancer 添加了基于主机的路由支持

[...] 您现在可以创建 Application Load Balancer 规则,根据Host标头中指定的域名路由传入流量。对api.example.com的请求可以发送给一个目标组,对mobile.example.com的请求可以发送给另一个目标组,而所有其他(通过默认规则)可以发送给第三个目标组。您还可以创建结合基于主机的路由和基于路径的路由的规则。这将允许您将请求路由到api.example.com/productionapi.example.com/sandbox到不同的目标组。

2016-08-11 更新

AWS 刚刚(2016 年 8 月 11 日)为 Elastic Load Balancing 服务推出了新的 Application Load Balancer,旨在提高实时应用程序、微服务、基于容器的架构和流式应用程序的灵活性和性能

这个新的负载均衡器也支持 WebSocket 协议和 HTTP/2,运行在应用层,提供基于内容的路由支持。这允许 Application Load Balancer 跨多个服务或运行在一个或多个 Amazon Elastic Compute Cloud (Amazon EC2) 实例上的容器路由请求,从而有助于降低成本并简化服务发现。[强调我的]

正如介绍性博客文章中所强调的那样,ELB 的这个新的应用程序负载均衡器选项 [...] 在第 7 层运行并支持许多高级功能 [其中] 原始选项(现在称为 Classic Load Balancer)仍然可用于您并继续提供第 4 层和第 7 层功能

更具体地说,ELB 现在支持手头的场景,因为每个 Application Load Balancer 允许您定义多达 10 个基于 URL 的规则来将请求路由到目标组(随着时间的推移, AWS 计划让您访问其他路由方法)。


初步答案

这是不可能的 - Amazon ELB主要(但见下文)提供传输层负载平衡(OSI第 4 层),其负载平衡决策仅基于 TCP 连接,但忽略应用程序有效负载。后者将允许应用程序层负载平衡(OSI第 7 层),其中应用程序有效负载确实被考虑到负载平衡决策。

Amazon ELB 中的默认配置实际上为 HTTP/HTTPS/SSL 提供了基本的应用程序级别支持(例如终止 SSL 连接和插入X-Forwarded-*标头),但您无法调整此配置;换句话说,ELB 确实在这里查看了 HTTP 请求,但是在这方面您无法控制 ELB 行为。

这在为您的负载均衡器选择侦听器中进行了更详细的解释,例如:

将 TCP/SSL(第 4 层)与 Elastic Load Balancing 结合使用

当您对前端和后端连接都使用 TCP 时,您的负载均衡器会将请求转发到后端实例,而不修改标头。此配置也不会为会话粘性或 X-Forwarded-* 标头插入 cookie。

[...]

将 HTTP/HTTPS(第 7 层)与 Elastic Load Balancing 结合使用

当您对前端和后端连接使用 HTTP(第 7 层)时,负载均衡器会解析请求中的标头并终止连接,然后再将请求重新发送到已注册的实例。这是 Elastic Load Balancing 提供的默认配置。

[强调我的]

架构概述还提供了说明和更多详细信息。

于 2012-05-11T14:15:13.107 回答
3

自从您发布问题以来已经有好几年了,但亚马逊最近宣布了应用程序(第 7 层)负载平衡功能。这应该支持您正在寻找的内容。

基本上,您可以根据“规则”(例如,URL 路径模式)定义流量路由到的不同目标组。可以根据需要对规则进行优先级排序。

请参阅https://aws.amazon.com/elasticloadbalancing/applicationloadbalancer/上的详细信息

于 2016-08-11T17:42:11.580 回答
0

这是我见过的一个可能的解决方案。它不如使用本机 Nginx Plus 进行负载平衡那么理想,但如果您需要使用 ELB,它可以工作。

让我们想象一下这样的架构:

                        ELB
                         |
          Server 1    Server 2   Server...
          (Current)   (Current)  (Current)
              \           |         /
                      Server X
                      (Legacy)

第一层中的每个服务器都运行“当前”实现。他们还在应用程序层之前运行 Nginx 或 Apache 作为 Web 服务器(这通常是任何 Web 应用程序之前的最佳实践,IMO)。

每个 Nginx/Apache 配置文件都包含对 URL 参数的行检查,表明这是一个将请求代理到服务器 X 的旧调用。如果它不是旧调用,它只会继续对“当前”应用程序的请求。

缺点是您在当前服务器中使用了几个周期来代理旧服务器,但您的架构非常简单,并且您有一个集中的流程。

于 2016-07-15T12:27:45.183 回答