ELB 可以根据 URL 重定向请求吗?

Posted

技术标签:

【中文标题】ELB 可以根据 URL 重定向请求吗?【英文标题】:Can ELB redirect request depending on the URL? 【发布时间】:2012-05-19 19:22:42 【问题描述】:

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

例如

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

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

我想知道:

    ELB 是否有能力查看 HTTP 请求? ELB 能否根据 URL 路径参数重定向请求?

【问题讨论】:

【参考方案1】:

2017-04-05 更新

在去年夏天推出支持基于路径的路由的新 Application Load Balancer 之后(请参阅前面的更新),AWS 现在还添加了Host-Based Routing Support for AWS Application Load Balancers:

[...] 您现在可以创建路由传入的应用程序负载均衡器规则 基于Host 标头中指定的域名的流量。 对 api.example.com 的请求可以发送到一个目标组,请求 到 mobile.example.com 到另一个和所有其他(默认情况下) 规则)可以发送给第三方。您还可以创建组合规则 基于主机的路由和基于路径的路由。这将允许您 将请求路由到 api.example.com/productionapi.example.com/sandbox 到不同的目标群体。

2016 年 8 月 11 日更新

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

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

正如introductory blog post 中所强调的,这个用于 ELB 的新 Application Load Balancer 选项 [...] 在第 7 层运行并支持许多高级功能 [whereras] 原始选项(现在称为 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 行为。

这在Choosing Listeners for Your Load Balancer 中有更详细的解释,例如:

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

当您同时使用 TCP 进行前端和后端连接时,您的 负载平衡器将将请求转发到后端实例 无需修改标题。这种配置也不会 为会话粘性或 X-Forwarded-* 标头插入 cookie。

[...]

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

在前端和后端都使用 HTTP(第 7 层)时 连接,您的负载均衡器解析请求中的标头并 在重新发送请求之前终止连接 注册实例。这是由提供的默认配置 弹性负载平衡。

[强调我的]

Architectural Overview 还提供了插图和更多详细信息。

【讨论】:

@AlexKliuchnikau - 我不知道这个问题的范围 - AWS 最近宣布了 Cross-Zone Load Balancing,但在 @ 最新版本的版本历史记录中没有出现其他相关变化987654331@ 自从这篇文章以来。 谢谢,我也得出结论,现在ELB中还不能做基于URL的路由。 这是与nginx.com/blog/using-ngnix-amazon-elastic-load-balancer-aws的有用链接 但是亚马逊有非 ELB 工具来实现这一点吗? ELB 仍然不支持。 HAProxy 可能是一个替代方案:***.com/questions/20606544/…【参考方案2】:

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

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

详情请见https://aws.amazon.com/elasticloadbalancing/applicationloadbalancer/

【讨论】:

【参考方案3】:

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

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

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

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

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

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

【讨论】:

以上是关于ELB 可以根据 URL 重定向请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

ELB 后面的 Symfony2 重定向到 http 而不是 https

nginx怎么根据url前缀实现301重定向?

Spring之跨重定向请求传递数据

Spring 安全更改重定向 URL 以使用 HTTPS 而不是 HTTP

如何为 AWS Elb 后面的 reactJs SPA 重定向 http 到 https?

JSP如何实现网页重定向