问题背景
使用swoole4.8版本 作为websocket服务端
nginx代理swoole服务
问题复现
开启websocket服务
heartbeat_check_interval 设置为60
heartbeat_idle_time 不设置
题外话:heartbeat_check_interval表示每隔多久轮循一次,单位为秒,如果该连接在 120 秒内(heartbeat_idle_time 未设置时默认为 interval 的两倍),没有向服务器发送任何数据,此连接将被强制关闭。若未配置,则不会启用心跳,该配置默认关闭。
Server 并不会主动向客户端发送心跳包,而是被动等待客户端发送心跳。服务器端的 heartbeat_check 仅仅是检测连接上一次发送数据的时间,如果超过限制,将切断连接。
被心跳检测切断的连接依然会触发 onClose 事件回调
测试发现在有心跳设置的情况下有几率被关闭连接
问题原因
排查发现,nginx设置反向代理时,设置了keepalive_timeout = 60(没有60秒接收到任何数据,则主动断开,如果在60秒内有数据传输,则从最后一次数据传输完毕后,重置计时时间)和proxy_read_timeout = 60(连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理,也可以说是后端服务器处理请求的时间),和心跳检测的时间一样,有几率导致close
此外还有proxy_send_timeout也需要注意(后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据)
解决方案
文章评论