当前位置: 首页 > news >正文

Nginx反向代理配置支持websocket

一、官方文档

WebSocket proxying

       为了将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket,使用了HTTP/1.1中可用的协议切换机制(RFC 2616: Hypertext Transfer Protocol – HTTP/1.1)。

       然而,这里有一个微妙之处:由于“升级”是逐跳报头(hop-by-hop),因此它不会从客户端传递到代理服务器。使用正向代理,客户端可以使用CONNECT方法来规避此问题。但是,这不适用于反向代理,因为客户端不知道任何代理服务器,并且需要在代理服务器上进行特殊处理。

       从1.3.13版本开始,nginx实现了特殊的操作模式,允许在客户端和代理服务器之间建立一个隧道,如果代理服务器返回一个带有代码101(切换协议)的响应,并且客户端通过请求中的“升级”头请求协议切换。

代理服务器nginx进行协议升级

二、基础配置 (只能处理websocket协议)

如上所述,包括“升级”和“连接”在内的逐跳报头不会从客户端传递到代理服务器,因此为了让代理服务器知道客户端将协议切换到WebSocket的意图,这些报头必须显式传递:

location /chat/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}

简单来说:是如果想要nginx支持websocket 需要配置

proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";

三、复杂配置 (可以同时处理websocket和http协议)

http {map $http_upgrade $connection_upgrade {default upgrade;''      close;}server {...location /chat/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}}

map语法解释:

当Upgrade是 ‘’ 的时候,设置Connection 为close,其他默认设置成upgrade,这样配置后,nginx就可以同时处理websockt和http请求了。

总结

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

相关文章:

  • 第18周 第1章Ajax基础知识
  • Axure原型系统:药企内部管理平台原型设计
  • Html--笔记01:使用软件vscode,简介Html5--基础骨架以及标题、段落、图片标签的使用
  • TypeScript 设计模式之【单例模式】
  • 数据备份策略:保障数据安全的关键
  • 从预测性维护到智能物流:ARM边缘计算控制器的工业实践
  • C++——编写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。用指针方法处理。
  • 入门插件开发-列表插件开发-第三节:案例演示——setFilter事件讲解
  • LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略
  • 【自学笔记】支持向量机(4)——支持向量回归SVR
  • 国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】
  • 三.python入门语法2
  • OSPF相关基础介绍及基础配置,网络工程师必修
  • redis Redis-Cluster常用命令与Redis性能监控
  • SSH防止暴力破解
  • 分享一款快速APP功能测试工具
  • Angular4 模板式表单用法以及验证
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Create React App 使用
  • HashMap ConcurrentHashMap
  • Node项目之评分系统(二)- 数据库设计
  • node学习系列之简单文件上传
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • TCP拥塞控制
  • Twitter赢在开放,三年创造奇迹
  • 百度小程序遇到的问题
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 入口文件开始,分析Vue源码实现
  • 微信小程序设置上一页数据
  • 项目实战-Api的解决方案
  • 译自由幺半群
  • gunicorn工作原理
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #07【面试问题整理】嵌入式软件工程师
  • #微信小程序(布局、渲染层基础知识)
  • $(selector).each()和$.each()的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (23)mysql中mysqldump备份数据库
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (70min)字节暑假实习二面(已挂)
  • (Java)【深基9.例1】选举学生会
  • (LeetCode 49)Anagrams
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm电影分享网站
  • (简单) HDU 2612 Find a way,BFS。
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)认识微服务
  • (转) 深度模型优化性能 调参
  • (转载)虚函数剖析
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat批处理(五):遍历指定目录下资源文件并更新