当前位置: 首页 > 编程笔记 >

如何将Nginx配置为WebSocket的反向代理

白淇
2023-03-14
本文向大家介绍如何将Nginx配置为WebSocket的反向代理,包括了如何将Nginx配置为WebSocket的反向代理的使用技巧和注意事项,需要的朋友参考一下

WebSocket是一种协议,提供了一种创建Web应用程序的方式,该应用程序支持客户端和服务器之间的实时双向通信。WebSocket使开发这些类型的应用程序变得更加容易。大多数现代浏览器都支持WebSocket,包括Firefox,Internet Explorer,Chrome,Safari和Opera,并且现在越来越多的服务器应用程序框架也支持WebSocket。

在生产环境中,需要多个WebSocket服务器来获得良好的性能和网站或应用程序的高可用性,需要了解WebSocket协议的负载平衡层,NGINX支持使用NGINX版本1.3中的WebSocket并可以采取行动作为进行应用程序负载平衡的反向代理。

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代理工作的实时示例。此示例有助于在Node.js上构建WebSocket实现。NGINX充当使用ws和Node.js的简单WebSocket应用程序的反向代理。这些说明已在Ubuntu 13.10和CentOS 6.5上进行了测试,但需要针对其他操作系统和版本进行调整。在此示例中,WebSocket服务器的IP地址为192.168.1.1,NGINX服务器的IP地址为192.168.1.2

如果没有安装Node.js和npm,请运行以下命令:

# sudo yum install nodejs npm

Node.js在Ubuntu上作为nodejs安装,在CentOS上作为node安装。该示例使用节点,因此在Ubuntu上,我们需要创建一个从nodejs到node的符号链接:

# ln -s /usr/bin/nodejs /usr/local/bin/node

要安装Websocket,请运行以下命令:

# sudo npm install ws

注意:如果收到错误消息,例如:“错误:无法从注册表获取:ws”,请运行以下命令来解决问题

# sudo npm config set registry http://registry.npmjs.org/

然后再次运行sudo npm install命令

# 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

服务器打印初始的“服务器已启动”消息,然后在端口8010上侦听,以等待客户端连接到它。当它收到客户端请求时,它会回显该请求,并将包含收到的消息的消息发送回客户端。为了让NGINX代理这些请求,我们创建以下配置

http {
   map $http_upgrade $connection_upgrade {
      default upgrade;
      '' close;
   }
   upstream websocket {
      server 192.168.1.1: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.1.2:8020

wscat通过NGINX代理连接到WebSocket服务器。当您键入wscat发送到服务器的消息时,您会看到它在服务器上回显,然后来自服务器的消息出现在客户端上。这是一个示例互动

服务器:客户端:

# node server.js
Server started
# wscat –connect ws://192.168.1.2:8020
Connected (press CTRL+C to quit)
> Hello
Received from client: Hello
< Server received from client: Hello

在这里,我们看到客户端和服务器能够通过充当代理服务器的NGINX进行通信,并且消息可以继续发送回去,直到客户端或服务器断开连接为止。将NGINX正确配置为处理WebSocket所需的所有操作,并正确设置标头以处理将连接从HTTP升级到WebSocket的Upgrade请求。

 类似资料:
  • 本文向大家介绍Nginx反向代理websocket配置实例,包括了Nginx反向代理websocket配置实例的使用技巧和注意事项,需要的朋友参考一下 最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 1.下载 tengine 最近的源码 2.安装基础的依赖包 3.解压编译安装 nginx.conf 的配置如下: test

  • 本文向大家介绍nginx反向代理webSocket配置详解,包括了nginx反向代理webSocket配置详解的使用技巧和注意事项,需要的朋友参考一下 最近在做项目的时候用到了webSocket协议,而且是在微信小程序中用到了webSocket,微信小程序中使用wss协议的时候不能设置端口,只能使用默认的443端口。我擦,我的https已经监听了443端口,webSocket再去监听443,肯定不

  • 我有一个运行在ip和端口上的MQTT(EMQX)服务器。我使用nodejs MQTT库在我的服务和该端口之间直接通信。 我想使用反向代理(nginx),以便能够使用DNS来修剪通信。 此时,我的nginx配置如下: 因此,当我尝试通过8888端口连接时,nginx总是超时 这两项服务都在docker容器中。并由docker编写。 MQTT服务的组合是: 和nginx是: 我必须在mqtt中更改任何

  • 我有一个部署在野蝇10.1应用程序服务器上的webapp。此webapp被监听:http://localhost:8080/app-profile-jsp/(1) 我成功安装了nginx。服务器已成功安装,我测试提供静态网页和图像。 现在我想配置nginx从“http://www . fri zio . local”(2)URL访问web应用程序。我在/etc/hosts中配置了这个地址。 我在n

  • 我正在尝试通过两个nginx代理发出websocket请求。是做SSR(服务器端渲染) 我的堆栈是这样的:外部世界 当我在做《外部世界》的时候 Websocket连接建立得非常好。但是当我实现rendora(SSR)并向nginx添加另一个代理时,它不起作用。握手时 Websocket 连接失败。我猜“升级”请求在我的nginx服务器的某个地方失败了。我的nginx conf如下: 因此,位置/端

  • 我有一个spring boot应用程序(带有Keyclope适配器),运行在端口8000上,Keyclope运行在8080上 我编辑了我的 /etc/hosts文件,将测试域(foo.bar.com)上的请求路由到127.0.0.1 到目前为止,我对SSL不感兴趣。 我的示例nginx配置: 问题: 此示例nginx conf是否足够?我有一些无限的重定向发生。我的spring应用程序中来自Key