详解nginx代理socket.io服务踩坑

 更新时间:2018年10月30日 08:35:37   作者:youmai の Blog  
这篇文章主要介绍了详解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=EoGaL3fRQlpTOaLp5eST

or

wss://***/?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策略的模将变化,之前的连接将全部失效,而对于微服务,扩缩容是很频繁的操作(特别是产品处于发展期),这种有损的扩缩容很大概率是不能接受的。

综上,建议直接使用websocket,毕竟不支持websocket的老版本占比很少,而且相对于先polling,耗时也会减少。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用Nginx创建临时和永久重定向的具体示例

    使用Nginx创建临时和永久重定向的具体示例

    HTTP 重定向 是将一个域名或地址指向另一个的方法,有几种不同类型的重定向,每种对客户端浏览器意味着不同的事情,最常见的两种类型是临时重定向和永久重定向,本文给大家介绍了使用Nginx创建临时和永久重定向的具体示例,需要的朋友可以参考下
    2024-07-07
  • nginx+lua(openresty)实现黑/白名单权限控制的示例

    nginx+lua(openresty)实现黑/白名单权限控制的示例

    本文介绍了如何使用Openresty进行权限控制和灰度发布,具体通过定时器定期更新黑名单数据,进行用户过滤和权限管控,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • Nginx如何提高Web应用的性能和安全性

    Nginx如何提高Web应用的性能和安全性

    现在越来越多的应用都离不开Web应用,但Web应用的性能问题也越来越成为企业关注的焦点,而Nginx作为一款高性能的Web服务器和反向代理服务器,能够为企业带来很多优势,Nginx的应用场景非常广泛,对于Web应用的优化、安全性的提升有着非常重要的作用
    2023-11-11
  • Apache和Nginx实现虚拟主机的3种方式小结

    Apache和Nginx实现虚拟主机的3种方式小结

    Apache是一个模型化的服务器,可以运行在几乎所有的服务器上。其属于应用服务器,这篇文章主要介绍了Apache和Nginx实现虚拟主机的3种方式,需要的朋友可以参考下
    2023-11-11
  • Nginx根据url中的path动态转发到upstream的实现

    Nginx根据url中的path动态转发到upstream的实现

    这篇文章主要介绍了Nginx根据url中的path动态转发到upstream的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 解决方案之关于Nginx高可用方案

    解决方案之关于Nginx高可用方案

    这篇文章主要介绍了解决方案之关于Nginx高可用方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • nginx部署前端项目location时root和alias配置指南

    nginx部署前端项目location时root和alias配置指南

    nginx指定文件路径有两种方式root和alias,下面这篇文章主要给大家介绍了关于nginx部署前端项目location时root和alias配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Nginx带宽控制(限速模块使用)

    Nginx带宽控制(限速模块使用)

    这篇文章主要介绍了Nginx带宽控制(限速模块使用),本文讲解了使用limit_rate和limit_rate_aft以及limit_conn实现带宽控制的例子,需要的朋友可以参考下
    2015-03-03
  • linux服务器部署tomcat和Nginx的教程

    linux服务器部署tomcat和Nginx的教程

    这篇文章主要为大家详细介绍了linux服务器部署tomcat和Nginx的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Nginx部署vue项目和配置代理的问题解析

    Nginx部署vue项目和配置代理的问题解析

    这篇文章主要介绍了Nginx部署vue项目和配置代理,需本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,要的朋友可以参考下
    2021-08-08

最新评论