NGINX作为WebSocket代理

排版很差。直接复制的,请看原文https://www.nginx.com/blog/websocket-nginx/

该网页套接字协议提供创建支持客户端和服务器之间的实时双向通信的Web应用程序的方式。WebSocket的一部分,使得开发这些类型的应用程序比以前可用的方法更容易。大多数现代浏览器支持包括Chrome,Firefox,Internet Explorer,Opera和Safari在内的WebSocket,越来越多的服务器应用程序框架现在也支持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升级机制使用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:

lns/usr/bin/nodejs/usr/local/bin/nodews 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 httpupgrade 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的消息以发送到服务器时,您会看到它在服务器上回显,然后客户端上显示来自服务器的消息。以下是一个示例交互:

服务器: 客户:
$ 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进行通信,并且消息可以继续来回发送,直到客户端或服务器断开连接。让NGINX正确处理WebSocket所需要的是正确设置头文件来处理将连接从HTTP升级到WebSocket的升级请求。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要用 Nginx 配置 WebSocket 代理,需要以下步骤: 1. 确保 Nginx 版本支持 WebSocket,需要 Nginx 1.3 或更高版本。 2. 在 Nginx 配置文件中添加以下内容: ``` map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } upstream backend { server backend.example.com:8080; } ``` 3. 重启 Nginx 服务器使配置生效。 以上是一个简单的 Nginx WebSocket 代理配置,根据你的实际需求可以进行相应的修改。 ### 回答2: 要使用Nginx配置WebSocket代理,需要按照以下步骤进行设置: 1. 确保你已经安装了Nginx,并且版本在1.3.13或以上。 2. 在Nginx配置文件中,找到或创建一个server块来处理WebSocket的请求。可以在http块中的server块内添加以下配置: ``` server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /backend { proxy_pass http://websocket_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` 3. 修改上述配置中的example.com为你的域名,在location /backend中的http://websocket_server改为你的WebSocket服务器地址。 4. 保存并关闭Nginx配置文件。 5. 配置WebSocket服务器的后端,确保它能够接收和处理WebSocket请求。 6. 检查Nginx配置文件是否有语法错误,使用以下命令进行验证: ``` nginx -t ``` 7. 如果没出现错误信息,重新加载Nginx配置文件: ``` nginx -s reload ``` 8. 确保Nginx正在运行,并监视日志文件以调试任何问题。可以使用以下命令启动Nginx: ``` service nginx start ``` 这样,你就成功地配置了Nginx作为WebSocket代理。注意,这里的配置只是一个示例,你可以根据自己的需求进行修改和调整。 ### 回答3: 要配置NGINX代理WebSocket,您需要按照以下步骤进行操作: 1. 确保您已经安装了NGINX,并且当前运行的是支持WebSocket的版本。 2. 打开NGINX配置文件。可以在`/etc/nginx/nginx.conf`或者`/etc/nginx/conf.d/`路径下找到该文件。 3. 在配置文件中找到`http`区块,并在此区块中添加以下内容: ``` map $http_upgrade $connection_upgrade { default upgrade; '' close; } ``` 4. 在`server`区块中,添加以下内容: ``` location /websocket-endpoint { proxy_pass http://backend-server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } ``` 替换`/websocket-endpoint`为您WebSocket的实际端点地址,并将`http://backend-server`替换为实际处理WebSocket请求的服务器地址。 5. 保存配置文件并关闭。 6. 验证配置文件语法是否正确,可以使用`nginx -t`命令进行检查。 7. 重新启动NGINX服务,以使配置文件生效。可以使用`systemctl restart nginx`或者`service nginx restart`命令。 现在,您已经成功配置了NGINX代理WebSocket。当客户端请求到达`/websocket-endpoint`时,NGINX将会将这些请求转发到后台服务器,并且将WebSocket标头(Upgrade和Connection)正确传递到后端服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值