无法使 websocket 连接与 ec2 + 应用程序负载均衡器配合使用

无法使 websocket 连接与 ec2 + 应用程序负载均衡器配合使用

我有一个 aws 应用程序负载均衡器,它在端口 9999 上有一个 https 侦听器,转发到端口 9999 上的一个组,以 ec2 实例为目标。

如果我使用配置为我的域的主机名运行我的 websocket 服务器api.example.com,那么当客户端尝试打开 websocket 连接时,它会得到:

WebSocket 握手期间出错:意外响应代码:502

但是,如果我用空字符串而不是域名配置我的 websocket 服务器,那么它会连接正好

这是有问题的,因为我打算在此实例上运行的服务器会自动启动 websocket 服务器除非提供了 websocket 主机名配置,因此空白字符串意味着 websocket 服务器永远不会启动!我宁愿不必破解库来绕过这种情况。所以我想知道,为什么空白字符串有效,而域名无效?

我尝试了 localhost、盒子的 ip 等等,除了空白字符串外,所有结果都是 502!

答案1

ALB 不使用主机名进行健康检查。因此,如果您的服务器不支持没有主机名的请求,健康检查将失败,导致访问 ALB 时出现 5xx 错误。

  • 检查 ALB 使用的目标组是否存在健康检查错误
  • 检查应用程序服务器日志中是否存在与健康检查相关的错误

如果您的服务器不支持此功能,您有两个选择:

  • 在你的服务器上使用一个可以处理没有主机名的请求的代理(例如 nginx),并在那里处理问题
  • 覆盖 ALB 健康检查端口,将其重定向到始终返回 HTTP 200 的端口(例如,在同一主机但在另一个端口上运行的 Apache)。

答案2

通过将 websocket 服务器主机设置为 0.0.0.0,我的问题得到了解决

相关内容