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的主要内容,如果未能解决你的问题,请参考以下文章
AWS 负载均衡器运行状况检查:运行状况检查失败,代码如下:[301]