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

问题描述:

就在工作好几周后,我们的Socket.io开始在某些浏览器上喷出错误。我已经尝试更新到最新的Socket.io版本,我试过我们在不同的机器上安装,我试过各种机器,它似乎在大多数浏览器上工作,没有明确的工作模式。Socket.io - 某些浏览器上的无效HTTP状态代码

这些错误出现在第二区间:

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,Socket.io上投票,因为ELB路由器不支持WebSockets的。

我发现,已造成这个问题,这是真的很意外......

这个问题来自于使用负载均衡服务,如AWS ELB(独立EC2应该罚款虽然)和Heroku的,其基础设施完全不支持Socket.io功能。 AWS ELB flat out将不支持WebSockets,Heroku的路由器对于Socket.io来说是垃圾,即使与socket.io-redis一起使用。

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

当socket.io返回400个错误时,在这种情况下,它会说“此会话不存在,并且您从未完成握手”,因为您完成了群集中不同服务器上的握手。

我的解决方案只是专门为我的web应用程序使用一个EC2实例来处理Socket.io。