WebSocket 协议给我们提供了一个创建可以支持客户端和服务端进行双向实时通信的web应用程序的方法。相比之前使用的方法,WebSocket(作为HTML5的一部分)可以使我们更容易开的发出这种类型的应用程序。绝大多数的现代浏览器都支持WebSocket,包括火狐,IE,Chrome,Safari以及Opera等,同时,越来越多的服务端框架也开始支持WebSocket了。

对于企业应用来说,我们需要多个WebSocket服务器来保障性能和高可用性,因此我们迫切的需要对WebSocket协议进行负载均衡。NGINX自从1.3版本就开始支持WebSocket了,并且可以为WebSocket应用程序做反向代理和负载均衡。

WebSocket 和HTTP协议不同,但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的基础设施。例如,WebSocket可以使用标准的HTTP端口 80 和 443,因此,现存的防火墙规则也同样适用。

一个WebSockets的应用程序会在客户端和服务端保持一个长时间工作的连接。用来将连接从HTTP升级到WebSocket的HTTP升级机制使用HTTP的Upgrade和Connection协议头。反向代理服务器在支持WebSocket方面面临着一些挑战。一项挑战是WebSocket是一个hop-by-hop协议,所以,当代理服务器拦截到一个客户端发来的Upgrade请求时,它(指服务器)需要将它自己的Upgrade请求发送给后端服务器,也包括合适的请求头。此外,由于WebSocket连接是长时间保持的,所以代理服务器需要允许这些连接处于打开状态,而不是像对待HTTP使用的短连接那样将其关闭。

NGINX 通过在客户端和后端服务器之间建立起一条隧道来支持WebSocket。为了使NGINX可以将来自客户端的Upgrade请求发送给后端服务器,Upgrade和Connection的头信息必须被显式的设置。如下所示:

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

一旦我们完成以上设置,NGINX就可以处理WebSocket连接了。

NGINX Websockets 举例

这里有一个展示NGINX如何为WebSocket做代理的实例。这个例子将会使用node.js上的一个实现了WebSocket的模块——ws。这个示例在Ubuntu 13.10 和 CentOS 6.5上测试通过,但对于其他系统来说也许需要稍作修改。就这个例子来说,WebSocket服务器的IP地址是192.168.100.10,NGINX服务器的IP地址是192.168.100.20。如果你还没有安装node.js和npm,你可以通过以下命令安装:

对 Debian/Ubuntu 来说:

sudo apt-get install nodejs npm

对 RHEL/CentOS 来说:

sudo yum install nodejs npm

在Ubuntu上,node.js会被安装为 "nodejs",在CentOS中被会安装为"node"。我们在这例子中统一使用"node",所以,我们将会在Ubuntu上创建一个连接来允许我们使用“node”:

ln -s /usr/bin/nodejs /usr/local/bin/node

然后安装 ws:

sudo npm install ws

注意:如果你得到了一个错误:“Error: failed to fetch from registry: ws” ,那么运行下面的命令应该能解决这个问题:

sudo npm config set registry http://registry.npmjs.org/

接下来,你可以再次运行 sudo npm install ws

ws命令来自/root/node_modules/ws/bin/wscat,我们将会把它当做我们的客户端,但是我们需要创建一个程序来做我们的服务端。将下面的代码保存到一个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);});});

这个程序可以通过下面的命令执行:

node server.js

该程序会输出一条初始化消息“Server started”,之后监听8010端口,等待客户端的连接。它会处理收到的所有请求,并且将接收到的消息输出在控制台,之后向客户端返回一条包含该消息的消息。我们希望NGINX去代理这些请求,通过下面的配置便可实现:

map $http_upgrade $connection_upgrade {default upgrade;'' close;
}
upstream websocket {server 192.168.100.10:8010;
}
server {listen 8020;location / {proxy_pass http://websocket;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";}
}

上面的配置会使NGINX监听8020端口,并把接收到的任何请求传递给后端的WebSocket服务器以便恰当的处理WebSocket协议。我们可以使用wscat作为客户端来测试一下:

/root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020

上面的命令会通过NGINX代理服务器和WebSocket服务器建立连接,你可以输入你想要发送给服务器的消息,之后服务器会返回一条消息。每当你输入一条消息,你应该可以在服务端看到该消息的输出,之后在客户端会显示一条来自服务端的消息。

这是一个交互示例:

由此我们可以看到服务端与客户端能够通过作为代理的NGINX通信, 而且消息可以持续进行双向传输直到客户端或服务端断开连接。为了能使NGINX正确处理WebSocket, 只需正确地设置消息头来处理更新从http到WebSocket连接的Upgrade请求

转载于:https://www.cnblogs.com/youlechang123/p/6774032.html

Nginx 作为 WebSockets 代理相关推荐

  1. Nginx担当WebSockets代理

    Nginx担当WebSockets代理 英文原文:http://nginx.com/blog/websocket-nginx/ 作者:chszs,转载需注明.博客主页:http://blog.csdn ...

  2. Nginx配置反向代理,一篇搞定!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/zxd1435513775/article/ details/102508463 一.引言 其他话 ...

  3. docker nginx 简单的代理设置

    nginx一种代理,虽然是开发,但是也要懂一些 这个地方我们通过docker 安装nginx并且设置简单的代理 如何安装nginx我这个地方就不做太多的叙述 现在我有一个网址: 10.0.13.140 ...

  4. nginx 实现反向代理

    由于网站需要显示大量的图片,我们的规则是只保存一张用户上传的原图,根据不同的页面使用图片的大小来生成不同大小的图片,这就使用到了nginx的反向代理功能! 反向代理: 反向代理指以代理服务器来接受网络 ...

  5. Nginx做前端代理时缓存与否的性能差别

    Nginx做前端代理,后端两台apache upstream webservers {------------------定义在http段server 172.16.20.31 ;server 172 ...

  6. Nginx之反向代理与负载均衡实现动静分离实战

    Nginx之反向代理与负载均衡实现动静分离实战 什么是反向代理与负载均衡 Nginx仅仅作为Nginx  proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果. 负载均衡指的是 ...

  7. nginx的反向代理及负载均衡

    查看内核版本号: uname  -r 查看Linux发行版本 :cat /etc/issue 或cat /etc/release 查看bash 版本 : bash  --version <?xm ...

  8. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)

    在 nginx 中,proxy 用来实现反向代理,upstream 用来实现负载均衡. 例如有两台服务器,nginx 服务器作为代理服务器,执行 .html 文件,apache 服务器上执行 .php ...

  9. Nginx实现静态代理,负载均衡,前后端分离

    Nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式对后端服务器做负载均 ...

最新文章

  1. WINCE6.0系统调用
  2. python改变字符串类型_python – Sklearn将字符串类标签更改为int
  3. WebLogic8.1 配置SSL/HTTPS单向认证
  4. 模拟实现unordered_mapunordered_set
  5. mybatis实战教程(mybatis in action)之二:以接口的方式编程
  6. 牛客题霸 [合并两个有序的数组] C++题解/答案
  7. SQL Server--疑难杂症之坑爹的Windows故障转移群集
  8. jdbc 批量insert_JDBC相关知识解答
  9. 怎么把一个Java应用打包成Docker镜像
  10. 南阳ACM 题目275:队花的烦恼一 Java版
  11. python开发mbus程序_一种PMBus总线电源模块的控制与实现
  12. 个人静态博客页面模板
  13. WinCC 中批量绑定变量
  14. Python入门-网络编程
  15. AMiner必读论文推荐
  16. 每日三省吾身:2014-1-16
  17. VMware安装、启动虚拟机报错:无法打开内核设备“\\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导?
  18. navicat点击连接出现2059catching_sha2_password错误
  19. 计算机视觉sci需要什么水平论文,计算机视觉论文在哪些sci期刊发表
  20. C# VBA 提取word中图片方法

热门文章

  1. SQL中实现截取字符串的函数
  2. SqlBulkCopy 批量复制数据到数据表
  3. [转] 一文弄懂神经网络中的反向传播法——BackPropagation
  4. 如果备份还原SecureCRT、Xshell远程工具远程
  5. Cisco堆叠配置步骤+链路聚合实例
  6. 2010-04-25 搞定aftr
  7. 取消win2003关机提示的设置
  8. python中的.idea文件夹是干嘛的
  9. java守护线程和用户线程的区别
  10. 【Mysql】数据库主从搭建-基于docker