2017-09-16 184 views
0

嗨,我有一个问题〜我想用nginx代理来分发websocket连接到其他端口。喜欢这个 。通过nginx代理的websocket?

客户====>代理=====> WS服务器

但我的问题是WebSocket的隧道是建立在客户端和WS服务器或客户端和代理和WS服务器上。

客户===代理==== WS服务器

或者

客户===== WS服务器

谢谢~~~

回答

1

你不不要像这样跳过代理。代理代表您进行连接。请参见下面的内容摘自https://www.nginx.com/blog/websocket-nginx/

一个WebSocket的应用程序保持一个长期运行的连接的客户端和服务器之间的开放,有利于实时应用程序的开发。用于将连接从HTTP升级到WebSocket的HTTP升级机制使用升级和连接标头。反向代理服务器在支持WebSocket时面临一些挑战。一种是WebSocket是逐跳协议,因此当代理服务器截获来自客户端的升级请求时,它需要将自己的升级请求发送到后端服务器,包括适当的标头。另外,由于WebSocket连接的寿命很长,与HTTP使用的典型的短暂连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们看起来是空闲的。

编辑-1 - Nginx的和直接的NodeJS

之间的连接比较所以最后我做了一些测试,以确保。开始于3000和80 nginx的一个socket.io应用程序转发请求到Socket.io

Nginx的

当我在两个浏览器窗口访问使用http://IP/应用,开放连接情况如下

$ lsof -i 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
node 4443 vagrant 11u IPv6 25730  0t0 TCP *:3000 (LISTEN) 
node 4443 vagrant 13u IPv6 28591  0t0 TCP localhost:3000->localhost:42698 (ESTABLISHED) 
node 4443 vagrant 14u IPv6 28626  0t0 TCP localhost:3000->localhost:42712 (ESTABLISHED) 
nginx 5144 vagrant 6u IPv4 28402  0t0 TCP *:http (LISTEN) 
nginx 5144 vagrant 13u IPv4 28589  0t0 TCP 192.168.33.100:http->192.168.33.1:64799 (ESTABLISHED) 
nginx 5144 vagrant 14u IPv4 28590  0t0 TCP localhost:42698->localhost:3000 (ESTABLISHED) 
nginx 5144 vagrant 15u IPv4 28625  0t0 TCP localhost:42712->localhost:3000 (ESTABLISHED) 
nginx 5144 vagrant 16u IPv4 28624  0t0 TCP 192.168.33.100:http->192.168.33.1:64826 (ESTABLISHED) 

现在都关闭的选项卡后

$ lsof 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
node 4443 vagrant 11u IPv6 25730  0t0 TCP *:3000 (LISTEN) 
nginx 5144 vagrant 6u IPv4 28402  0t0 TCP *:http (LISTEN) 

NodeJS

打开两个浏览器选项卡,并直接连接到NodeJS http://<IP>:3000。那么结果如下

$ lsof -i 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
node 4443 vagrant 11u IPv6 25730  0t0 TCP *:3000 (LISTEN) 
node 4443 vagrant 13u IPv6 30014  0t0 TCP 192.168.33.100:3000->192.168.33.1:52550 (ESTABLISHED) 
node 4443 vagrant 14u IPv6 30015  0t0 TCP 192.168.33.100:3000->192.168.33.1:52551 (ESTABLISHED) 
node 4443 vagrant 15u IPv6 30016  0t0 TCP 192.168.33.100:3000->192.168.33.1:52552 (ESTABLISHED) 
node 4443 vagrant 16u IPv6 30017  0t0 TCP 192.168.33.100:3000->192.168.33.1:52553 (ESTABLISHED) 
node 4443 vagrant 17u IPv6 30018  0t0 TCP 192.168.33.100:3000->192.168.33.1:52554 (ESTABLISHED) 
node 4443 vagrant 18u IPv6 30020  0t0 TCP 192.168.33.100:3000->192.168.33.1:52556 (ESTABLISHED) 
node 4443 vagrant 19u IPv6 30024  0t0 TCP 192.168.33.100:3000->192.168.33.1:52578 (ESTABLISHED) 
nginx 5144 vagrant 6u IPv4 28402  0t0 TCP *:http (LISTEN) 

这看起来有点奇怪,但是这是因为用于打开该网站的连接也保持存活几秒钟。所以等待一段时间后

$ lsof -i 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
node 4443 vagrant 11u IPv6 25730  0t0 TCP *:3000 (LISTEN) 
node 4443 vagrant 18u IPv6 30020  0t0 TCP 192.168.33.100:3000->192.168.33.1:52556 (ESTABLISHED) 
node 4443 vagrant 19u IPv6 30024  0t0 TCP 192.168.33.100:3000->192.168.33.1:52578 (ESTABLISHED) 
nginx 5144 vagrant 6u IPv4 28402  0t0 TCP *:http (LISTEN) 

正如你所看到的没有。当您使用Nginx

+0

谢谢〜但websocket隧道通过代理传递给客户端时,连接总是会更高。这意味着nginx应该打开tcp来连接客户端和ws服务器。如果我有1000个websocket连接,nginx将创建1000个tcp。如果我们有2个Ws服务器,这意味着一个Ws服务器将创建500个TCP?这样对吗 ? –

+0

我假设是的,但我现在对这个权利没有很深入的理解来坚定地说出是的。 –

+0

@MarkLin,请参阅我的编辑 –