嗨,我有一个问题〜我想用nginx代理来分发websocket连接到其他端口。喜欢这个 。通过nginx代理的websocket?
客户====>代理=====> WS服务器
但我的问题是WebSocket的隧道是建立在客户端和WS服务器或客户端和代理和WS服务器上。
客户===代理==== WS服务器
或者
客户===== WS服务器
谢谢~~~
嗨,我有一个问题〜我想用nginx代理来分发websocket连接到其他端口。喜欢这个 。通过nginx代理的websocket?
客户====>代理=====> WS服务器
但我的问题是WebSocket的隧道是建立在客户端和WS服务器或客户端和代理和WS服务器上。
客户===代理==== WS服务器
或者
客户===== WS服务器
谢谢~~~
你不不要像这样跳过代理。代理代表您进行连接。请参见下面的内容摘自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
谢谢〜但websocket隧道通过代理传递给客户端时,连接总是会更高。这意味着nginx应该打开tcp来连接客户端和ws服务器。如果我有1000个websocket连接,nginx将创建1000个tcp。如果我们有2个Ws服务器,这意味着一个Ws服务器将创建500个TCP?这样对吗 ? –
我假设是的,但我现在对这个权利没有很深入的理解来坚定地说出是的。 –
@MarkLin,请参阅我的编辑 –