nginx为WebSocket做反向代理,WebSocket服务器连接302

本文介绍如何使用NGINX进行WebSocket负载均衡,实现企业级高性能和高可用性。探讨了WebSocket协议与HTTP的不同之处,以及NGINX如何通过升级请求适配现有基础设施。通过示例展示了NGINX配置和Node.js WebSocket服务器的集成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于企业生产用途,需要多个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:

ln−s/usr/bin/nodejs/usr/local/bin/node要安装ws,请运行以下命令:ln−s/usr/bin/nodejs/usr/local/bin/node要安装ws,请运行以下命令: 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 httpupgradehttpupgradeconnection_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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13


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
  • 1

Connected (press CTRL+C to quit)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值