SocketIO、Websocket断开重连问题排查方案

用了SocketIO,Websocket好久了,并且在不同的项目上因为网络的复杂程度以及代理的不同出现了各种websocket断开重连的问题。本篇总结websocket使用过程中的断开重连问题,主要是SocketIO使用过程中的问题。首先是在Nginx代理中遇到的问题,因为websocket是由HTTP协议升级为websocket的,因此我们并不能完全像配置HTTP代理那样配置配置websocket的代理,如下为Nginx提供的官方websocket的配置:

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

上面的配置中必须配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";这两个选项,否则会出现断开重连的问题。第二HTTP的协议必须是1.1,而非1.0否则也会出现断开重连的问题。

在确定代理配置没有问题之后,如果还有断开重连的问题,这时候我们需要通过抓包,来排查问题,因为网络的复杂性、防火墙、网络配置等问题,可能造成发送的包有问题,导致重连失败。这里我们以socket.io的连接为例,socket.io一开始并不直接升级http为websocket,而是先发送一个http请求获取sid等一些客户端需要的参数,抓包如下:

 如上为HTTP请求的内容,会返回sid 服务端客户端唯一标识,升级协议upgrades为websocket,ping间隔为5000毫秒,即心跳间隔为5秒,超时为25000毫秒即25秒不发送心跳会断开连接。HTTP协议升级为websocket协议的请求如下:

发送包中的主要内容为上图中使用方格画起来的,里面的内容缺一不可,有时候因为防火墙或者其他原因导致圈起来的包内容丢失导致不断的断开重连。 本篇主要是排查websocket断开重连的一些思路,websocket断开重连时可以从这些角度去排查,还有就是Nginx代理如果有多台websocket服务,则必须使用iphash策略转发请求,否则也会导致断开重连问题。

猜你喜欢

转载自blog.csdn.net/wk19920726/article/details/109023816