千家信息网

nginx代理socket.io服务的坑怎么解决

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要介绍"nginx代理socket.io服务的坑怎么解决",在日常操作中,相信很多人在nginx代理socket.io服务的坑怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2025年02月05日nginx代理socket.io服务的坑怎么解决

这篇文章主要介绍"nginx代理socket.io服务的坑怎么解决",在日常操作中,相信很多人在nginx代理socket.io服务的坑怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"nginx代理socket.io服务的坑怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

nginx代理了两台socket.io服务器。socket.io的工作模式是polling升级到websocket

现象

通过nginx请求服务时,出现了大量的400错误,有时候能升级到websocket,有时候会一直报错。但是直接通过 ip+端口 访问时,100%能成功。

分析

sid

sid是我们这个问题的关键。在初始创建连接时(polling模式就是在模拟一个长连接),客户端会发起这样的请求:

https://***/?eio=3&transport=polling&t=1540820717277-0

服务端收到后会创建一个对象,绑定在这个连接上,同时返回一个sid(session id),来标记这个会话。会话指什么呢,会话是一连串的交互,这些交互之间是有联系的,在我们这个场景下就是,下一次的http请求到来,我需要找到之前绑定在理论上的长连接(这里还没有websocket,所以是理论上的)上的那个对象。我们知道http请求是无状态的,每个请求之间独立,所以socket.io引入了sid来做这件事。服务端收到请求后会生成一个sid,看下response:

复制代码 代码如下:

{"sid":"eogal3frqlptoalp5est","upgrades":["websocket"],"pinginterval":8000,"pingtimeout":10000}

之后每次请求都需要带上这个sid,建立websocket请求的连接也不例外。所以说,sid是polling,以及polling升级到websocket的关键。这之后的请求类似于:

https://***/?eio=3&transport=polling&t=1540820717314-1&sid=eogal3frqlptoalp5estorwss://***/?eio=3&transport=websocket&t=1540820717314-1&sid=eogal3frqlptoalp5est

那么问题来了,如果请求是带上的sid不是服务端生成的会怎样呢?服务端会不认识,给你返回一个400,并告诉你

invalid sid

我们遇到的便是这个问题,nginx默认的负载均衡策略是轮询,所以请求有可能会打到不是生成这个sid的机器上去,这时候我们就会收到一个400,如果运气好,可能也会打到原来的机器上,运气更好一点,甚至能坚持到websocket连接建立。

解决

这里提出两种方案

  1. nginx的负载均衡采用ip_hash,这样能保证一个客户端的请求都走到一台服务器上

  2. 不使用polling模式,只使用websocket

这两种方案各有利弊。第二种显而易见,不支持websocket的古老浏览器和客户端将没法工作。第一种的问题隐藏得比较深,试想,如果你增减了机器会怎样,这时候ip_hash策略的模将变化,之前的连接将全部失效,而对于微服务,扩缩容是很频繁的操作(特别是产品处于发展期),这种有损的扩缩容很大概率是不能接受的。

到此,关于"nginx代理socket.io服务的坑怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

服务 代理 问题 学习 客户 机器 模式 理论 升级 生成 均衡 之间 代码 关键 客户端 对象 就是 方案 更多 有时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 概述主要的网络安全产品及其功能 网络技术部门工作总结 数据库的查询实训心得 计算机网络技术阶段作业 江西石豆互联网科技有限公司 新乡新乡昇云网络技术 数据库无法锁定单元格 东城区信息化软件开发优势 服务器网卡要求 网络安全四小会议 23魔方祖源数据库河南张 医院信息系统网络安全文章 杭州高球云上网络技术有限公司 查看数据库表数量 深圳科技互联网名企排名 说明什么是数据库 怎么让数据库数据备份 电大数据库形考任务测试答案 谁有软件开发商的号码 软件开发编程培训机构哪个好 软件开发哪的服务好 苹果服务器怎么充电 数据库触发器的设置初始值 移动网络技术与旅游业 软件开发属于知识产权费用吗 网络安全规划实施计划 东莞微信软件开发订制 卫煌网络技术有限公司 手机app一般用的什么服务器 网络安全大致分为网络运行安全
0