「应用中间件」使用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的升级请求。

相关文章
|
2月前
|
人工智能 安全 中间件
阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”
9 月 26 日,2025 云栖大会 AI 中间件:AI 时代的中间件技术演进与创新实践论坛上,阿里云智能集团资深技术专家林清山发表主题演讲《未来已来:下一代 AI 中间件重磅发布,解锁 AI 应用架构新范式》,重磅发布阿里云 AI 中间件,提供面向分布式多 Agent 架构的基座,包括:AgentScope-Java(兼容 Spring AI Alibaba 生态),AI MQ(基于Apache RocketMQ 的 AI 能力升级),AI 网关 Higress,AI 注册与配置中心 Nacos,以及覆盖模型与算力的 AI 可观测体系。
694 32
|
4月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
1758 3
|
10月前
|
网络协议 应用服务中间件 网络安全
Nginx,正向代理
本文介绍了Nginx作为HTTPS正向代理的两种方案:HTTP CONNECT隧道(7层)和NGINX stream(4层)。HTTP CONNECT隧道需要客户端手动配置代理,通过CONNECT请求建立隧道;而NGINX stream则更适合透明代理,利用SNI字段实现流量转发。文章详细讲解了两者的原理、环境搭建、使用场景及常见问题,并提供了配置示例和最佳实践建议。内容转载自阿里云开发者社区@怀知的文章,推荐读者参阅原文获取更多信息。感谢您的阅读!
1351 80
Nginx,正向代理
|
9月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
263 19
|
9月前
|
存储 缓存 应用服务中间件
Nginx 响应头 Vary 的介绍与应用
`Vary` 头部字段在Web开发中扮演着重要角色,通过合理使用 `Vary`,可以优化缓存策略,提升Web应用的性能和响应速度。本文介绍了 `Vary` 头部字段的基本概念、作用、常见使用场景及其在Nginx中的配置方法。通过这些内容,希望读者能够更好地理解和应用 `Vary` 头部字段,提高Web应用的缓存效率和用户体验。
378 10
|
10月前
|
数据挖掘 UED
WebSocket在实时体育比分网站中的应用
WebSocket 在实时体育比分网站中用于实时比分更新、动态赛事信息推送、交互式功能(如即时聊天和投票)、赛程提醒与推送通知、比分预测与数据分析,以及多平台支持。通过持久连接,服务器可即时推送比分变化、球员动态、比赛状态等信息,减少延迟并提升用户体验。同时,WebSocket 支持双向通信,使用户能实时互动,确保跨平台的实时数据同步。
158 10
|
监控 安全 中间件
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
241 0
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
|
11月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
423 11
|
前端开发 应用服务中间件 定位技术
Nginx 如何代理转发传递真实 ip 地址?
【10月更文挑战第32天】
2519 5
Nginx 如何代理转发传递真实 ip 地址?
|
12月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用

热门文章

最新文章