我有一个 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,我的问题得到了解决