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

Nginx: 实现Websocket代理

概述

  • Nginx 代理模式中,大多都是基于 HTTP 的 Proxy 模块来对应设置的
  • 除此之外,Nginx 还可以实现更多细小化的协议的HTTP代理,比如 ws 的代理

WS 的建立模式

  • websocket 它其实是建立在HTTP连接上,先要建立起HTTP连接

  • 建立好连接以后,客户端会向服务端发送一个 Upgrade 的协议头将连接升级到 websocket

  • 这样的话,从HTTP连接升级到了websocket的连接

  • 它可以实现最重要的一个特点就是双向通信。

    • 就是客户端可以向服务端主动发送请求
    • 这个时候服务端也可以向客户端来发送主动请求
    • 这样就实现了一个很好的双向连接
  • 来看一下这个图,建立好了HTTP连接以后,客户端会向服务端来主动发送一个头信息

  • 就是upgrade, 服务端收到了这个头信息会将这个协议的建立升级到websocket的这个模式里面去

  • 建立好了双向的这个websocket连接,服务端这个时候也可以主动向客户端来发请求了

  • 客户端收到信息以后也可以再回应,这样的话就建立起了一个类似于长连接的这种双向通信的这个模式

  • Websocket 代理场景

    • 多人聊天
    • APP信息推送

Nginx 实现 ws 代理

  • 其实就是客户端向 Nginx 这个代理中心建立一个ws也就是websocket连接
  • Nginx 将会将这种连接代理到后端的服务端里面去,只是说把地址做了一个变化,变成一个内部的地址
  • 对客户端而言,其实就是跟Nginx建立连接的, 而代理只是说将连接做了一层转发到真实的服务端
  • wscat 是客户端测试的工具

1 ) 环境配置

  • 在linux 上安装 nodejs,$ yum install nodejs -y
  • 安装 npm 工具,$ yum install npm
  • 安装 websocket 模块,$ npm install ws
  • 安装 wscat 工具,$ npm install wscat

2 ) 准备后端nodejs程序(ws程序) server.js

console.log("Server started");
var Msg = '';
var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({port:8010});

wss.on('connection', function(ws){
	ws.on('message', function(message) {
		console.log('Received from client: %s', message);
		ws.send('Server received from client: ' + message);
	});
});
  • 启动这个服务

3 )配置 Nginx

websocket_proxy.conf

# map 实现映射的赋值,给 $connection_upgrade 来赋值
map $http_upgrade $connection_upgrade {
	default upgrade;
	'' close;
}

# 转发到 
upstream websocket {
	server 127.0.0.1:8010; # 这个后续换成真实的ip 这是 ws 服务
}

server {
	listen 8020;
	access_log   /var/log/nginx/test_websocket.access.log   main;
	location / {
		proxy_pass                http://websocket;
		proxy_http_version   1.1;
		proxy_set_header     Upgrade  $http_upgrade;                   # 最重要的两行
		proxy_set_header     Connection $connection_upgrade;    # 最重要的两行
	}
}
  • Nginx 的 map 配置选项: 通过 map 进行变量中内容映射后赋值
    • 语法:map string $variable { … }
      • string 也可以是一个变量
    • Default: –
    • Context: http
  • 文档地址:ngx_http_map_module
  • 上面 map 配置的意义
    • map 会判断 客户端发送过来的 $http_upgrade 变量是否是有值的,如果没有值
      • 则把 $connection_upgrade 赋值为 upgrade
    • 如果客户端发送过来的 $http_upgrade 变量值为 ‘’
      • 则把 $connection_upgrade 赋值为 close 表示连接关闭
  • 启动 nginx
    • $ nginx -c /etc/nginx/nginx.conf 这个配置文件包含上述子配置文件
    • $ netstat -luntp | grep 80 可查看对应的 8010 和 8020

4 )通过 wscat 来测试

  • $ wscat --connet ws://127.0.0.1:8020 注意,这里是8020是nginx的代理端口
    • 随机在窗口中输入内容回车
    • 之后,服务端返回信息
  • 这样,就可以看到,全双工通信的过程了
  • 整个代理过程完毕

http://www.kler.cn/a/403655.html

相关文章:

  • python基础知识(七)——写入excel
  • Python | Leetcode Python题解之第564题数组嵌套
  • vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则
  • 吉林大学 超星慕课 高级语言程序设计 学习通部分题目极其答案
  • docker学习笔记跟常用命令总结
  • Docker和VMWare有什么不同
  • vue使用List.forEach遍历集合元素
  • Word_小问题解决_1
  • 「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成
  • 构建nginx1.26.1轻量级Docker镜像添加第三方模块nginx_upstream_check_module
  • 关于Redis单线程模型以及IO多路复用的理解
  • 【青牛科技】 GC3910:摇头机、舞台灯、Printer 和白色家电的理想驱动芯片是A3909/ALLEGRO 的优质国产替代
  • git自动转换换行符问题
  • python实现了一个基于深度学习的少样本视觉识别任务,并涉及到领域自适应(Domain Adaptation)的相关操作
  • uniapp 选择 省市区 省市 以及 回显
  • 【PPTist】开源PPT编辑器初体验
  • `ls -l ~/.ssh` 命令将列出 `.ssh` 目录中所有文件
  • 【ChatGPT】实现贪吃蛇游戏
  • 【加入默语老师的私域】C#面试题
  • JAVA:探索 PDF 文字提取的技术指南