基于 AWS 应用程序负载均衡器 (ALB) 路径的路由未按预期运行

Posted

技术标签:

【中文标题】基于 AWS 应用程序负载均衡器 (ALB) 路径的路由未按预期运行【英文标题】:AWS Application Load Balancer (ALB) path based routing not functioning as expected 【发布时间】:2017-12-26 06:08:06 【问题描述】:

我正在开发一个 POC,以证明基于 AWS 路径的路由通过 Application Load Balancer 到一组使用 express 的非常基本的“hello world”node.js 应用程序。如果没有基于路径的路由并没有多个侦听器,每个应用程序有 1 个侦听器,每个相应的侦听器和应用程序都按预期工作。因此,目标组内的目标均已通过健康检查并显示为健康。但是,当我在 1 个侦听器上切换到基于路径的路由实现(删除另一个不必要的侦听器)时,两个应用程序都会出现以下错误:

无法获取 /expressapp 无法获取 /expressapp2

我查看了以下文档以试图找出问题所在: http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#path-conditions

我错过了什么?有什么疑难解答的想法吗?

【问题讨论】:

我刚刚在底部注意到了这一点:“请注意,路径模式用于路由请求但不会改变它们。例如,如果规则具有 /img/* 的路径模式,则规则会将 /img/picture.jpg 的请求作为 /img/picture.jpg 的请求转发给指定的目标组。”路径转发是问题,因为我试图使用路径然后将请求发送到备用端口,但我希望在其中一种情况下剥离路径,而不是在另一种情况下。有人知道怎么做吗? 我不知道该怎么做;但我很乐意。我现在遇到了同样的问题。尝试将/jenkins* 转发到 jenkins 容器的登录页面,/grafana* 转发到 grafana 登录等。但是,每个带有扩展名的请求都会返回默认值,然后通常会失败或返回 404。基于端口的侦听器工作美好的。关于如何处理这个问题的想法? @Mr.Budris 解决这个问题?相同的状态 404 =/ 谢谢。 @DiegoBorges 是的——在容器上运行 nginx ;) 但实际上,它更适合拆分这类服务,因为它提供了强大的路由和 URL 重写。 你使用的是 ALB 还是 ELB?我正在使用 ALB,但在 AWS 控制台上看不到任何基于路径的路由 【参考方案1】:

我相信您收到此错误是因为相关服务不希望接收以/expressapp/expressapp2 为前缀的路径。当 ALB 将流量转发到您的服务时,路径保持不变。

剥离前缀无法由 ALB 处理。如果您无权访问应用程序的源代码,则需要使用某种反向代理(如 nginx)在将它们发送到应用程序之前重写 url。

如果你可以访问源代码,express 支持changing the base url without modifying the code。您可以读取 url 前缀的值作为环境变量,并相应地配置您各自的服务环境。

【讨论】:

【参考方案2】:

我会从各自的位置翻转这两个规则,即制定 expressapp2 规则 #1 和 express app 规则 #2 以使其按您希望的方式工作。

ALB 按优先级顺序评估这些规则,即使上下文路径是 expressapp2,它仍然匹配 expressapp 并评估第一个规则。

【讨论】:

以上是关于基于 AWS 应用程序负载均衡器 (ALB) 路径的路由未按预期运行的主要内容,如果未能解决你的问题,请参考以下文章

HAProxy 上的哪些设置需要与 AWS ALB(应用程序负载均衡器)配合使用?

AWS使用ALB负载均衡遇到的问题

AWS/ALB、http/2 和 GOAWAY

带有 ALB 入口控制器的 Terraform AWS Kubernetes EKS 资源不会创建负载均衡器

AWS 负载均衡器返回 403 响应?

如何在 Istio 中设置 AWS ALB 而不是 ELB?