nginxwebsocketproxy断连问题

author author     2023-04-08     189

关键词:

参考技术A 由于项目中需要服务端向移动设备主动推送信令,于是引入websocket协议进行移动设备和服务端之间的通信。Demo程序很正常,服务端使用nodejs ws类库起一个websocket服务器,android设备中使用Okhttp3-ws对接,一切都比较正常。但是集成到生产环境kong api gateway后出现了连接一段时间android设备出现java.io.EOFException错误,服务端ws服务器出现1006错误,websocket连接断开的问题。

由于demo程序运行正常,生产环境与demo环境区别在于android设备和服务端之间使用kong api gateway工具进行了proxy,kong是基于Nginx的api管理工具,于是问题分析重点锁定gateway转发的过程。

首先抓包比对一下demo环境和生产环境区别。
demo环境wireshark包:

可以看到,GET请求包和协议切换响应包间隔很短。

kong 环境包:

尝试修改了read timeout的时间,果然出现断连的时间随着timeout而变化,应该就是Nginx这个机制导致的。文档中也明确说明了解决方法,在时间间隔小于read timeout的轮询中不断和服务器进行ping包发送来刷新timeout时间。
实际测试,用20秒的间隔不断给服务器发送心跳,可以保持websocket连接不断。
但是还有一个问题,http upgarde包发出去后应该要等http code 101 Switching Protocols这个包回来才算握手完成,才可以建立tcp长连接,但是在nginx环境下这个包60秒后才回来,但是中间数据交互都是正常的,让人匪夷所思。
再仔细看下nginx转发wireshark包,发现http code 101 Switching Protocols包是由3片TCP包组装而成的:

第一帧序号23,找到后发现内容就是服务器响应握手的http报文内容

所以在25帧时实际已经握手完成了,并非在62秒才传包回来。
第二帧:

传递的数据是connected.
这样就和协议描述一致,先完成handshake再transfer data。但是经过nginx抓发的包一直没有结束符,所以导致wireshark在断连得时候才显示该http报完成,此处不知是不是nginx websocket proxy的bug? 如果有大神知道还请指导。

oralce断连后不自动断开问题

CS客户端登陆提示错误:maxinum number of connections to instance exceeded问题原因:客户端每次连接oracle数据库,有时未断开,服务端中一直积累了连接数 解决方法:一、调整允许连接的最大数方法一:用PLSQL或... 查看详情

高阶函数之断连重试

在近场通信中发现断连重视是一个比不可少的功能,其中典型的近场通信就是蓝牙,通常使用的蓝牙设备如蓝牙耳机、蓝牙手表等传输距离大多在10米以内效果最佳,超距离或待机(长时间不工作)后会与中心设备(服务端)断... 查看详情

华为交换机未配置超时设备

设置执行命令idle-timeout00即关闭VTY用户界面的超时断连功能。如果VTY用户界面没有设置闲置断连功能,则有可能导致其他用户无法获得空闲连接。通常情况下,推荐设置用户界面断连的超时时间在10~15分钟之间。说明:该命令只... 查看详情

colab断连弹出“无法分配后端”解决办法“没有可用的premiumgpu后端。您要使用标准gpu吗?”(代码片段)

避免断连:CtrlShift+IfunctionConnectButton()document.querySelector("colab-connect-button").shadowRoot.querySelector("#connect").click()setTimeout(function()document.querySelector("colab-dialog").querySelector("paper-dialog").querySelector("paper-butt... 查看详情

colab断连弹出“无法分配后端”解决办法“没有可用的premiumgpu后端。您要使用标准gpu吗?”(代码片段)

避免断连:CtrlShift+IfunctionConnectButton()document.querySelector("colab-connect-button").shadowRoot.querySelector("#connect").click()setTimeout(function()document.querySelector 查看详情

java物联网企业级项目指标数据采集与断连监控(代码片段)

第2章指标数据采集与断连监控学习目标能够完成EMQ指标主题订阅能够完成指标数据的解析能够完成告警判断与存储能够运用EMQ的webhook实现设备断连监控1.EMQ指标主题订阅1.1Eclipsepaho简介Eclipsepaho是eclipse基金会下面的一个开源项目... 查看详情

全国首个高校元宇宙院系成立;airpodspro2莫名其妙断连;archlinux停止支持python2|极客头条

「极客头条」——技术人员的新闻圈!CSDN的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。整理|梦依丹出品|CSDN(ID:CSDNnews)一分钟速览新闻点!... 查看详情

mobaxterm

...动断开连接的问题。通过以下简单设置,可以解决无操作断连问题。1、打开MobaXterm的设置界面2、选择SSH设置,勾选“SSHkeepalive”选项即可 查看详情

rubberduck重写了duck类fly方法

...定要将任务完成)。又比如在清数据的时候,数据库发生断连。这时候我们会发现线程死掉了,任务终止了,我们需要重启整个项目把该定时任务起 查看详情

screen的简单操作指令(持续更新中)

...前言记录下自己使用过的screen命令,可以解决服务器断连之后需要重新跑代码的问题。持续更新中正文创建screen界面:screen-SXXX[窗口名]查看screen窗口:screen-ls通过查询的pid值,可删除不用的screen窗口:screen-SXX... 查看详情

screen的简单操作指令(持续更新中)

...前言记录下自己使用过的screen命令,可以解决服务器断连之后需要重新跑代码的问题。持续更新中正文创建screen界面:screen-SXXX[窗口名]查看screen窗口:screen-ls通过查询的pid值,可删除不用的screen窗口:kill-pid... 查看详情

android--wifi的nud检测机制浅析(代码片段)

...机制浅析      这段时间遇到几次WiFi连接后,突然断连的问题,最后发现是由于Android的NUD检测机制导致的。NUD(NeighborUnreachableDetection,邻居不可达检测)的底层实现还是依赖kernel,Android层有服务建立通信,当kernel... 查看详情

android--wifi的nud检测机制浅析(代码片段)

...机制浅析      这段时间遇到几次WiFi连接后,突然断连的问题,最后发现是由于Android的NUD检测机制导致的。NUD(NeighborUnreachableDetection,邻居不可达检测)的底层实现还是依赖kernel,Android层有服务建立通信,当kernel... 查看详情

adb连接小米手机

...监听adbtcpip5555连接指定ip地址的设备adbconnect192.168.9.77:5555断连adbdisconnect192.168.9.77 查看详情

javawebsocket客户端断线重连|实用代码框架(代码片段)

...ocket客户端连接服务端的时候,网络波动,服务端断连的情况。会导致客户端被动断开连接。为了解决这个问题,需要对被动断开连接的情况进行捕获,并重新创建连接。这篇文章主要是提供可以直接使用的断线... 查看详情

pl/sqldeveloper中文乱码,为啥呢?怎么解决?oracle问题

...、ORA-01041特征:客户端(代理或应用服务器)有时报这类断连错误。原因:如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。    措施:如果偶尔出现,... 查看详情

pl/sqldeveloper中文乱码,为啥呢?怎么解决?oracle问题

...、ORA-01041特征:客户端(代理或应用服务器)有时报这类断连错误。原因:如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。    措施:如果偶尔出现,... 查看详情

fiscobcospbft网络优化(代码片段)

...据包,提升网络效率。PBFT消息转发优化为了保证节点断连情况下共识消息包能到达所有节点,FISCOBCOSPBFT共识模块采用了消息转发机制,优化前的消息转发机制如下: 对于全连四节点区块链系统,系统TTL&#x 查看详情