用了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等一些客户端需要的参数,抓包如下: