NGINX作为WebSocket代理

来源:互联网 发布:做皮卡剧的软件 编辑:程序博客网 时间:2024/06/05 23:58

排版很差。直接复制的,请看原文https://www.nginx.com/blog/websocket-nginx/

该网页套接字协议提供创建支持客户端和服务器之间的实时双向通信的Web应用程序的方式。WebSocket的一部分,使得开发这些类型的应用程序比以前可用的方法更容易。大多数现代浏览器支持包括Chrome,Firefox,Internet Explorer,Opera和Safari在内的WebSocket,越来越多的服务器应用程序框架现在也支持WebSocket。

对于企业生产用途,需要多个WebSocket服务器来实现性能和高可用性,需要了解WebSocket协议的负载平衡层,NGINX自1.3版本起支持WebSocket,并可作为反向代理,并进行WebSocket的负载平衡应用。(所有版本的NGINX Plus也支持WebSocket。)

查看关于NGINX可扩展性的最新性能测试,以负载平衡WebSocket连接。

WebSocket协议与HTTP协议不同,但WebSocket握手与HTTP兼容,使用HTTP升级工具将连接从HTTP升级到WebSocket。这允许WebSocket应用程序更容易地适应现有的基础架构。例如,WebSocket应用程序可以使用标准HTTP端口80和443,从而允许使用现有的防火墙规则。

WebSocket应用程序可以在客户端和服务器之间保持长时间运行的连接,从而有助于开发实时应用程序。用于将连接从HTTP升级到WebSocket的HTTP升级机制使用Upgrade和Connection头。反向代理服务器在支持WebSocket时面临一些挑战。一个是WebSocket是一个逐跳协议,因此当代理服务器拦截客户端的升级请求时,需要向后端服务器发送自己的升级请求,包括相应的头文件。此外,由于WebSocket连接长期存在,与HTTP使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。

允许在客户机和后端服务器之间建立隧道,NGINX支持WebSocket。对于NGINX将升级请求从客户端发送到后台服务器,必须明确设置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 Websocket示例

这是一个现场示例,显示NGINX作为WebSocket代理。此示例使用ws,一种基于Node.js的WebSocket实现。NGINX作为使用ws和Node.js的简单WebSocket应用程序的反向代理。这些说明已经通过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
Node.js安装nodejs在Ubuntu和nodeCentOS上。本例使用node,所以在Ubuntu上,我们需要从创建符号链接nodejs到node:

lns/usr/bin/nodejs/usr/local/bin/nodews sudo npm install ws
注意:如果您收到错误消息:“错误:无法从注册表中获取: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代理这些请求,我们创建以下配置:

http {
map httpupgradeconnection_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 $connection_upgrade;    }}

}
NGINX侦听端口8020,并向后端WebSocket服务器发送代理请求。该proxy_set_header指令使NGINX妥善处理WebSocket协议。

要测试服务器,我们运行wscat作为我们的客户端:

$ /root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020
wscat通过NGINX代理连接到WebSocket服务器。当您键入wscat的消息以发送到服务器时,您会看到它在服务器上回显,然后客户端上显示来自服务器的消息。以下是一个示例交互:

服务器: 客户:
$ node server.js
Server started

wscat --connect ws://192.168.100.20:8020

Connected (press CTRL+C to quit)

Hello
Received from client: Hello
< Server received from client: Hello
在这里,我们看到客户端和服务器能够通过作为代理的NGINX进行通信,并且消息可以继续来回发送,直到客户端或服务器断开连接。让NGINX正确处理WebSocket所需要的是正确设置头文件来处理将连接从HTTP升级到WebSocket的升级请求。

原创粉丝点击