使用Nginx做WebSockets代理教程

WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法。作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程 序的难度。目前主流的浏览器都支持WebSockets,包括火狐、IE、Chrome、Safari以及Opera等,而且,越来越多的服务器应用框架 也开始支持WebSockets。

要 在企业产品中使用WebSockets,为满足高性能和高可用性,需要多个WebSocket服务器。负载均衡层需要支持WebSocket协议。 Nginx从1.3版起就开始支持WebSocket协议,而且可以担当WebSocket应用程序的反向代理以及实现负载均衡。

WebSocket 协议和HTTP协议不同,但是WebSocket协议的握手和HTTP是兼容的,它使用HTTP的Upgrade协议头将连接从HTTP连接升级到 WebSocket连接。这个特性使得WebSocket应用程序可以很容易地应用到现有的基础设施。例如,WebSocket应用可以使用标准的80和 443 HTTP端口,因此可以通过现有的防火墙设施。

WebSockets 应用程序会在客户端和服务器之间建立一个长连接,使得开发实时应用很容易。HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到 WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头。反向代理服务器在支持WebSocket协议方面 面临着一些挑战。挑战之一是WebSocket是一个逐段转发(hop-by-hop)协议,因此当代理服务器拦截到来自客户端的Upgrade请求时, 代理服务器需要将自己的Upgrade请求发送给后端服务器,包括适合的请求头。而且,由于WebSocket连接是长连接,与传统的HTTP端连接截然 不同,故反向代理服务器还需要允许这些连接处于打开(Open)状态,而不能因为其空闲就关闭了连接。

Nginx通过在客户端和后端服务器之间建立隧道来支持WebSockets通信。为了让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做代理的。此例将使用ws模块,它是基于node.js构建的WebSocket实现。Nginx将 担当反向代理服务器,后端服务器是一个使用了ws和Node.js的简单WebSockets应用。例子使用的命令在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服务器建立连接,你可以向服务器发送任意消息,然后服务器会返回一条消息。每当你在客户端发送一条消息,在后端服务器上能看到该消息的输出,之后在客户端会显示一条来自服务端的消息。
这是一个交互示例:


Server:


Client:


$ 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反向代理建立WebSockets通信,而且消息可以持续地进行双向传输,直至客户端或服务器断开连接。为 了让Nginx能正确处理WebSocket连接,只需正确地设置消息头来处理从HTTP连接升级到WebSocket连接的Upgrade请求。

时间: 2024-10-09 22:10:36

使用Nginx做WebSockets代理教程的相关文章

Nginx担当WebSockets代理

Nginx担当WebSockets代理 英文原文:http://nginx.com/blog/websocket-nginx/ 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法.作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难度.目前主流的浏览器都支持WebSockets,包括火狐.IE.Chrome.Safari以及Opera等,

【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

阅读目录 > 参考的优秀文章 > 设置等待被代理服务器的最大响应时间 > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往往超过60秒.而Nginx默认设置超时时间为60秒. 针对这一情况,需修改默认配置.因配置项中涉及超时的选项太多,这里记录一下. 等待被代理服务器的最大响应时间为120秒,需加如下配置: proxy_read_timeout 1

nginx做正向代理

Nginx常用来做反向代理,但是作为正向代理大家有没有试过呢? Nginx配置如下: server{        resolver x.x.x.x;        listen 82;        location / {                proxy_pass http://$http_host$request_uri;        }} 注意项:1. 不能有hostname2. 必须有resolver, 即dns,即上面的x.x.x.x,换成你们的DNS服务器ip即可3 .

nginx做反向代理+apache

先上个规划图,自己随便画的,大家也随便看看 192.168.1.119为nginx做反向代理并处理静态页面,apache处理动态页面,nfs共享网站家目录,svn代码管理. 192.168.101为apache处理动态页面,挂载192.168.1.119的共享目录. 192.168.1.96为mysql数据库,允许两台web服务的连接权限. 系统使用centos6.5 一,配置192.168.1.119 1.首先在192.168.1.119上安装nginx+apache+php+nfs+svn

Nginx做反向代理总是被系统kill

公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux OOM Killer了,这篇文章感觉有点关系:理解和配置 Linux 下的 OOM Killer.也给出了相应的解决办法. 但我还是不太放心,万一最后还是被kill了怎么办,想来想去,最后还是决定写一个脚本来进行监控. 脚本功能: 每隔5秒检查一次,查看Nginx进程是否存在,如果不存在,就重新启动

CentOS 7 安装Nginx做反向代理

题记 须要使用nginx的反向代理功能,測试环境为centos+NGINX 1.8.0. 跳过一些繁琐的问题,直接记录核心 步骤 (1)centos 安装在VM中.因此须要注意网络连接问题 (2)安装nginx使用的是具有网络的yum功能 (3)配置centos防火墙,须要开启80 port (4)nginx 反向代理配置 (5)性能优化设置(兴许工作...) 实现 一. yum安装nginx 先加入nginx源,測试使用最新的nginx 1.8.0 rpm -ivh http://nginx.

nginx做反向代理时出现302错误

现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文件中定义的proxy_set_header Host $host; 意思是nginx接收到浏览器请求后修改请求头中的host信息,然后再把请求转发给后端真实服务节点,服务节点响应后把返回信息传送给nginx,而由于nginx是使用的非80端口做代理,后端服务节点却依然以为nginx是80端口,所以响

NGINX学习(七)--nginx做正向代理

1.概述 nginx的正向代理,只能代理http.tcp等,不能代理https请求.有很多人不是很理解具体什么是nginx的正向代理.什么是反向代理.下面结合自己的使用做的一个简介: 1)正向代理: 所谓正向代理就是内网服务器主动要去请求外网的地址或服务,所进行的一种行为.内网服务---访问--->外网 2)反向代理: 所谓反向代理就是外网要访问内网服务而进行的一种行为. 外网----请求--->内网服务 (是不是太简洁了#@#) 2.两种代理配置方式: 1)正向代理: server端: 应用

nginx做反向代理和后端web服务器之间的交互

1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如GoAgent,翻墙神器. 一个完整的代理请求过程为:客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接.或则获得目标服务器的指定资源.Web代理服务器是网络的中间实体.代理位于Web客户端和Web服务器之间,扮演"中间人"的角色. HTTP的代理服务