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

时间:2017-07-20 11:31:45

标签: amazon-web-services amazon-elb

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

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

现在出现了问题。 HTTP健康检查通过没有任何问题,但Websocket检查总是不健康,我不知道为什么。根据{{​​3}},使用HTTP / HTTPS侦听器也应该适用于WS / WSS。

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

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

我从Docker Swarm中启动了websocket容器,只是为了测试它是否与Swarm相关(我非常确定它不是,但是为了测试的缘故),它也不起作用,所以现在我有点失去希望了。

我可能缺少哪些配置,以便HTTP服务可以工作,但Websocket服务不起作用?。

更新

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

更新2

看起来ELB没有将连接从HTTP升级到WebSocket。

2 个答案:

答案 0 :(得分:0)

ALB不支持以下各项的WebSocket运行状况检查:

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

“运行状况检查不支持WebSockets。”

问题在于,尽管AWS声称ALB实际上支持HTTP2,但它会将所有内容降采样为HTTP1,然后这样做,然后再次将其升级为HTTP2,这会破坏一切。

答案 1 :(得分:0)

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