Google HTTP负载均衡器无法升级Web套接字连接

时间:2014-10-23 06:05:12

标签: google-compute-engine

我刚刚添加了一个HTTP负载均衡器,指向运行Tornado Web服务器的几个Google Compute Engine实例。特别是,他们正在处理websockets。

当我通过负载均衡器(在Chrome中)访问带有嵌入式websocket的页面时,我得到:

Error during WebSocket handshake: Unexpected response code: 400

这是通过DNS以及点击负载均衡器的IP。

然而,当我点击一个单独的实例时,我能够成功握手websocket。

当我通过负载均衡器获取页面时,我没有在Web服务器中看到任何400个日志,这进一步表明它是负载均衡器没有让它通过。

我可以做些什么来允许HTTP'升级'吗?或者这在云平台HTTP负载均衡器中是不可能的。

编辑:我也可以通过'网络负载均衡器'握手websocket,所以所有迹象都指向HTTP负载均衡器是问题。

4 个答案:

答案 0 :(得分:5)

截至今天(2015年7月),GCP的HTTP LB和AWS的ELB不支持Websockets。

GCP的解决方法是使用网络负载均衡器(https://cloud.google.com/compute/docs/load-balancing/network/)。

ELB的解决方法是使用TCP / SSL而不是HTTP / HTTPS。

答案 1 :(得分:1)

尝试将负载均衡器设置为使用TCP或SSL而不是HTTP或HTTPS。我在AWS负载均衡器上遇到了同样的问题,而这个转换似乎解决了这个问题。我怀疑HTTP设置正在过滤websocket需要的一些数据包。

答案 2 :(得分:0)

您是否在LB中表现健康?如果是这种情况,您可以执行tcpdump以查看您的实例如何在LB后面直接回复。确保LB的IP背后的响应来自您实例的公共IP而不是私有IP。

如果它不健康,那么您需要仔细检查实例并确保每次都正确关闭TCP连接。

答案 3 :(得分:0)

此问题现已解决(截至2017年) https://cloud.google.com/load-balancing/docs/https/#websocket_proxy_support 无需进行任何更改即可使用。