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/production 和 api.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
Spring 安全更改重定向 URL 以使用 HTTPS 而不是 HTTP