「应用中间件」使用NGINX作为WebSocket代理

简介: 「应用中间件」使用NGINX作为WebSocket代理

WebSocket协议提供了一种创建支持客户端和服务器之间实时双向通信的web应用程序的方法。作为HTML5的一部分,WebSocket使开发这些类型的应用程序比以前可用的方法容易得多。大多数现代浏览器都支持WebSocket,包括Chrome、Firefox、Internet Explorer、Opera和Safari,现在越来越多的服务器应用程序框架也支持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升级机制使用升级和连接头。反向代理服务器在支持WebSocket方面面临一些挑战。一个是WebSocket是一个逐跳协议,因此当代理服务器拦截来自客户机的升级请求时,它需要将自己的升级请求发送到后端服务器,包括适当的头文件。此外,由于WebSocket连接是长寿命的,与HTTP使用的典型短寿命连接相反,反向代理需要允许这些连接保持打开状态,而不是因为它们看起来是空闲的而关闭它们。

NGINX支持WebSocket,允许在客户机和后端服务器之间建立隧道。NGINX要将升级请求从客户端发送到后端服务器,必须显式设置升级和连接头,如下例所示:

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在Ubuntu上安装为nodejs,在CentOS上安装为node。这个例子使用了node,所以在Ubuntu上我们需要创建一个从nodejs到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代理这些请求,我们创建以下配置:

http {
 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 $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要发送到服务器的消息时,您将看到它在服务器上发出回显,然后来自服务器的一条消息出现在客户机上。下面是一个互动的例子:

Server:Client:$ node server.js

Server started

wscat --connect ws://192.168.100.20:8020

Connected (press CTRL+C to quit)

> HelloReceived from client: Hello < Server received from client: Hello

这里我们看到客户机和服务器能够通过NGINX进行通信,NGINX充当代理,消息可以继续来回发送,直到客户机或服务器断开连接。要使NGINX正确处理WebSocket,所需要做的就是正确地设置头文件,以处理将连接从HTTP升级到WebSocket的升级请求。

相关文章
|
3月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
101 19
|
3月前
|
存储 缓存 应用服务中间件
Nginx 响应头 Vary 的介绍与应用
`Vary` 头部字段在Web开发中扮演着重要角色,通过合理使用 `Vary`,可以优化缓存策略,提升Web应用的性能和响应速度。本文介绍了 `Vary` 头部字段的基本概念、作用、常见使用场景及其在Nginx中的配置方法。通过这些内容,希望读者能够更好地理解和应用 `Vary` 头部字段,提高Web应用的缓存效率和用户体验。
87 10
|
4月前
|
数据挖掘 UED
WebSocket在实时体育比分网站中的应用
WebSocket 在实时体育比分网站中用于实时比分更新、动态赛事信息推送、交互式功能(如即时聊天和投票)、赛程提醒与推送通知、比分预测与数据分析,以及多平台支持。通过持久连接,服务器可即时推送比分变化、球员动态、比赛状态等信息,减少延迟并提升用户体验。同时,WebSocket 支持双向通信,使用户能实时互动,确保跨平台的实时数据同步。
104 10
|
4月前
|
监控 安全 中间件
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
103 0
|
6月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
6月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
311 1
|
6月前
|
消息中间件 存储 Apache
探索 RocketMQ:企业级消息中间件的选择与应用
RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统,广泛应用于金融、电商、日志系统、数据分析等领域。
461 0
探索 RocketMQ:企业级消息中间件的选择与应用
|
7月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
342 7
|
6月前
|
Kubernetes Cloud Native JavaScript
为使用WebSocket构建的双向通信应用带来基于服务网格的全链路灰度
介绍如何使用为基于WebSocket的云原生应用构建全链路灰度方案。
|
7月前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
402 0