导读:为了适应大量消息推送的业务场景,需要多个WebSocket服务器来保障性能和高可用性,因此需要使用Nginx对WebSocket服务器进行反向代理负载均衡。本文将对以下四点做出讨论:

  • 代理服务器获取流量的方式
  • Nginx代理的方式
  • Nginx如何支持WebSocket
  • Nginx配置WebSocket方式

一、代理服务器获取流量的方式

客户端通常都会直接与Web服务器进行通信。那么当使用代理服务器作为客户端和服务器两者间一个“中介”时,代理服务器获取流量的方式有以下四种方式:

  • 修改客户端:将客户端配置为使用代理服务器,那么客户端会直接将HTTP请求有意的发送到代理服务器上。
  • 修改网络:网络基础设备可以通过若干种技术手段,在客户端不知情或没有参与的情况下,拦截网络流量并将其导入代理,这种代理称为拦截代理。
  • 修改DNS命名空间:放在Web服务器之前的代理服务器,替代物,会直接假扮Web服务器的名字和IP地址
  • 修改Web服务器:将Web服务器配置为向客户端发送一条HTTP重定向命令,将客户端的请求重定向到代理服务器上。

二、Nginx代理的方式

客户端和代理服务器建立连接并发送请求,代理服务器端接收客户端的请求后与具体的服务器建立连接,并把请求分发给服务器进行处理,最后再将服务器的响应结果反馈给客户端。

三、Nginx如何支持WebSocket

WebSocket 和HTTP虽然是不同协议,但是两者“握手”方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。如下图所示

Http升级为WebSocket

因为WebSocket协议是一个hop-by-hop协议(此类头部字段只对单次转发有效。会因为转发给缓存/代理服务器而失效),为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须被显式的设置。可以通过下文将要讲解的修改Nginx的配置文件方式解决此问题。

代理服务器分别与客户端和服务器建立连接,由于WebSocket连接是长时间保持的,所以代理服务器需要允许这些连接处于打开状态,而不是像对待HTTP使用的短连接那样将其关闭。

四、Nginx配置Websocket方式

通过修改nginx.conf配置,如下图所示

1.map是根据客户端请求中 $http_upgrade 的值来构造改变 $connection_upgrade 的值,即根据变量 $http_upgrade 的值和{} 里规则创建新的变量 $connection_upgrade并赋值。

2.HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头;为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。如上图代码中第三个红圈。

五、总结

通过Http升级机制将Http升级为WebSocket。Nginx代理服务器通过修改配置的方式解决了WebSocket属于hop-by-hop协议的问题、并通过保持分别与客户端和服务端的连接一直处于打开状态从而实现WebSokcet的代理。

六.结尾

感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将持续分享IT技术知识。

websocket 携带请求头_WebSocket与Nginx的小秘密相关推荐

  1. 请求头有问题导致Nginx返回400状态码

    背景 上个星期有人找我看了Nginx的问题,场景是这样的,用户访问一个网址,这个网址有一个按钮,点击这个按钮后会跳转到新的页面,但这个跳转,有时候可以,有时候不可以--不可以的时候页面显示400状态码 ...

  2. 前端cookie 放到请求头_ajax请求携带cookie和自定义请求头header(跨域和同域)

    错误: 1.ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须设置withCredential为true. 正确: 1.ajax同域请求下,ajax会自动带上同源的cookie: 2 ...

  3. 03-requests模块携带UA请求头,携带参数,携带cookie,持久化存储

    reques模块的基础使用方法 chrome浏览器使用方法了解新建隐身窗口的目的,了解chrome中network的使用 1,新建隐身窗口(无痕窗口) 浏览器中直接打开网站,会自动带上之前网站保存的c ...

  4. oauth2关于websocket携带token的探讨

    oauth2关于websocket携带token的探讨 一.简述 二.关于websocket请求携带token 2.1.通过websocket下的子协议来实现 2.2.资源服务器放开请求路径. 2.3 ...

  5. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

  6. Python爬虫——2.底层操作和请求头、请求代理以及cookie操作

    本文章此节主要讲解: ·爬虫程序urllib2模块底层操作: ·请求头的设置和添加: ·请求代理的种类和类型: ·关于cookie的操作(手动添加/程序自动获取) 一.爬虫底层操作和请求头的设置 1. ...

  7. RestTemplate配置调用接口的请求头

    一.问题出现 通过RestTemplate发送Http接口调用时,对于请求需要携带请求头时,需要额外再进行配置. 二.解决方案 给请求携带请求头,有两种实现的方式: 方式一:在每次发送请求时,构建一个 ...

  8. 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题

    解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题 参考文章: (1)解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题 (2)ht ...

  9. openresty获取nginx请求头信息

    vi test.lua:在nginx.conf配置文件中已经指定了lua脚本了 获取到请求头信息可以帮助我们做什么呢? ①比如对同一请求url,实际上也可以认定为是同一请求用户,可以限定其单位时间内的 ...

最新文章

  1. 微软小冰发布知乎主题曲,人工智能首次开始接近人类歌手水平
  2. excel两个指标相关性分析_Excel实操分析函数,投资决策指标的假设分析,就是那么简单...
  3. 8086内存分段理解
  4. Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包
  5. Java 8 Optional类深度解析
  6. java语言实现常用算法(排序和查找)
  7. 解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……
  8. pg 简单备份和恢复
  9. 常见笔顺错误的字_易错汉字笔画顺序 你全都会吗?
  10. Slideout.js+YDUI Touch+mescroll
  11. 《旷野游荡的精灵》 一个会写诗的程序员 2019.3
  12. 离散分布的分布函数_数据分析|概率分布
  13. 树莓派开发板入门学习笔记2:[转]树莓派系统在VM中能做什么
  14. [Alg]排序算法之分布排序
  15. Redis升级到 6.x 版本后,12306网站起飞了!
  16. TongWeb上传文件功能介绍
  17. UI设计师有哪些就业方向选择?
  18. RT-Thread-设备(fal)
  19. 花生日记运营商怎么做
  20. 增量pi和pid调节代码

热门文章

  1. redis集群部署一直卡在Waiting for the cluster to join ......
  2. python爬虫实战:利用scrapy,短短50行代码下载整站短视频
  3. vue.js响应式原理解析与实现
  4. 使用PyCharm创建Django项目及基本配置
  5. 关于“AI是不是胡扯”之争:这是中国科技圈的胜利
  6. HDOJ--4786--Fibonacci Tree【生成树】
  7. 新书发布《每天5分钟玩转Docker容器技术》
  8. Swift 3.0 beta 6权限访问修改
  9. android studio 中的编码问题
  10. Spring4.1新特性——Spring MVC增强