AWS ALB 运行状况检查通过 HTTP 但未通过 Websocket

Posted

技术标签:

【中文标题】AWS ALB 运行状况检查通过 HTTP 但未通过 Websocket【英文标题】:AWS ALB health check pass HTTP but not Websocket 【发布时间】:2017-12-26 01:52:00 【问题描述】:

我有一个部署在 Docker Swarm 中的应用程序,它有两个可公开访问的服务,HTTP 和 WS。

我创建了两个目标组,每个服务一个,注册的实例是 Docker Swarm 的管理者。然后我创建了 ALB 并添加了两个 HTTPS 侦听器,每个侦听器都指向特定的目标组。

现在问题来了。 HTTP 健康检查通过没有问题,但是 Websocket 检查总是不健康,不知道为什么。根据http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html 的说法,使用 HTTP/HTTPS 侦听器也应该适用于 WS/WSS。

在 WS 检查中,我尝试将 / 和应用程序实际使用的路径 /ws 作为路径。他们都没有通过健康检查。

这也不是与防火墙有关的问题。安全组是完全开放的,并且没有 iptables 规则,因此可以双向连接。

我从 Docker Swarm 中启动了 websocket 容器,只是为了测试它是否与 Swarm 相关(我很确定它不是,但是地狱..为了测试),它也没有工作,所以现在我有点绝望了。

我可能缺少什么配置,以便 HTTP 服务可以工作,但 Websocket 服务不能?

更新

我回来处理这个问题,经过进一步研究,问题似乎是目标群体,而不是 ALB 本身。阅读文档http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html,我忘记启用粘性选项。但是,我只是这样做了,问题仍然存在。

更新 2

ELB 似乎没有将连接从 HTTP 升级到 WebSocket。

【问题讨论】:

问题解决了吗? @Kostanos nope,仍在努力解决这个问题 @yzT 你有解决方法吗?我可以考虑运行迷你网络服务器来执行健康检查的替代方案,但是嗯...... @CyrilDuchon-Doris 我们不再使用 websockets,所以不知道 AWS 方面是否发生了变化。 【参考方案1】:

我遇到了类似的问题。当 ALB 检查 WS 服务时,它会从它接收 HTTP 状态 101(交换协议)。而且,正如其他答案中所指出的,这对于 ALB 来说并不是一个足够好的回应。我尝试更改运行状况检查配置中的匹配器代码,但它不允许 200-299 范围之外的任何内容。 在我的设置中,我让 Socket.io 在 Express.js 之上运行,所以我通过将 Socket.io 路径(不要将路径与命名空间混淆)更改为 /ws 并让 Express.js 回答 @987654322 的请求来解决它@。将运行状况检查指向/,然后就完成了。

【讨论】:

【参考方案2】:

ALB 不支持 websocket 健康检查:

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

"健康检查不支持 WebSockets。"

问题在于,尽管 AWS 声称 ALB 支持 HTTP2,但实际上它会将所有内容缩减为 HTTP1,然后执行此操作,然后再次将其升级到 HTTP2,这会破坏所有内容。

【讨论】:

以上是关于AWS ALB 运行状况检查通过 HTTP 但未通过 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

ECS 服务的 AWS 网络负载均衡器运行状况检查失败

AWS 容器运行状况检查

AWS 负载均衡器运行状况检查:运行状况检查失败,代码如下:[301]

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

AWS ECS Fargate 容器运行状况检查命令

AWS/ALB、http/2 和 GOAWAY