Socket.io - 某些浏览器上的HTTP状态代码无效

时间:2014-09-03 16:16:30

标签: node.js socket.io polling

经过几周的正常工作,我们的Socket.io开始在某些浏览器上出现错误。我已经尝试更新到最新的Socket.io版本,我已经在不同的机器上尝试过我们的设置,我已经尝试过各种各样的机器,它似乎适用于大多数没有明确模式的浏览器。

这些错误会在第二个时间间隔出现:

OPTIONS https://website.com/socket.io/?EIO=2&transport=polling&t=1409760272713-52&sid=Dkp1cq0lpKV75IO8AdA3  socket.io-1.0.6.js:2

XMLHttpRequest cannot load https://website.com/socket.io/?EIO=2&transport=polling&t=1409760272713-52&sid=Dkp1cq0lpKV75IO8AdA3. Invalid HTTP status code 400 

由于ELB路由器不支持WebSockets,我们支持亚马逊的ELB,Socket.io投票。

1 个答案:

答案 0 :(得分:1)

我发现了造成这种情况的问题,这真是出乎意料......

这个问题来自使用负载平衡服务,例如AWS ELB(虽然独立的EC2应该没问题)和Heroku,他们的基础设施并不完全支持Socket.io功能。 AWS ELB不支持WebSockets,而Heroku的路由器也是Socket.io的垃圾,即使与socket.io-redis一起使用。

使用单个服务器时会隐藏此问题,但是一旦开始群集,就会出现问题。我的应用程序上的单个Heroku dyno工作正常,然后当我们没有使用多个服务器时,问题开始出现在开发中。我们尝试使用粘滞负载平衡的ELB,即便如此,我们仍然遇到了同样的问题。

当socket.io返回400个错误时,在这种情况下它会说"这个会话不存在而你从未完成握手",因为你在你的另一台服务器上完成了握手群集。

我的解决方案就是为我的网络应用程序专用EC2实例来处理Socket.io。