为Nginx 配置 WebSocket

WebSocket 是一个协议, 它提供了一种创建 web 应用程序的方法, 它支持客户端和服务器之间的 real-time 双向通信。WebSocket 使开发这些类型的应用程序更加容易。大多数现代浏览器支持 WebSocket, 包括 Firefox、ie 浏览器、浏览器、Safari 和 Opera, 越来越多的服务器应用框架也在支持 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 连接处理。

例子

我们使用nodejs来写一个测试例子,首先安装node

	sudo yum install nodejs npm
	ln -s /usr/bin/nodejs /usr/local/bin/node
	sudo npm install ws
	

我们的node程序为:文件名为: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.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 协议。

  默认情况下,如果代理的服务器在60秒内没有传输任何数据,则连接将被关闭。这个超时可以通过 proxy read timeout 指令来增加 。或者,代理服务器可以配置为定期发送WebSocket ping帧以重置超时并检查连接是否仍然存在。

为了测试服务器, 我们在客户机系统中运行 wscat

	/root/node_modules/ws/bin/wscat --connect ws://192.168.1.2:8020
	

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

客户端:

	 # 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。

参考资料

 

如果你想就本篇文章与我交流,可以在文章下方留言或者写邮件到me#wenchao.ren(#->@)
本文版权归作者所有,除非文章内特别说明,否则你可以随意转载本站的文章,但请文章页面明显位置给出原文连接。谢谢。
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注