【发布时间】:2023-03-11 06:00:01
【问题描述】:
您好我有一个问题~我想使用 nginx 代理来分发 websocket 连接到其他端口。像这样。
客户端 ====> 代理 =====> ws 服务器
但我的问题是 websocket 隧道是建立在客户端和 ws 服务器或客户端和代理和 ws 服务器上的。
客户端 === 代理 ==== ws 服务器
或者
客户端 ===== ws 服务器
谢谢~~~
【问题讨论】:
您好我有一个问题~我想使用 nginx 代理来分发 websocket 连接到其他端口。像这样。
客户端 ====> 代理 =====> ws 服务器
但我的问题是 websocket 隧道是建立在客户端和 ws 服务器或客户端和代理和 ws 服务器上的。
客户端 === 代理 ==== ws 服务器
或者
客户端 ===== ws 服务器
谢谢~~~
【问题讨论】:
您不会这样跳过代理。代理代表您建立连接。请参阅以下来自https://www.nginx.com/blog/websocket-nginx/的摘录
WebSocket 应用程序在客户端和服务器之间保持一个长时间运行的连接,从而促进实时应用程序的开发。用于将连接从 HTTP 升级到 WebSocket 的 HTTP 升级机制使用 Upgrade 和 Connection 标头。反向代理服务器在支持 WebSocket 方面面临一些挑战。一个是 WebSocket 是一种逐跳协议,因此当代理服务器拦截来自客户端的升级请求时,它需要向后端服务器发送自己的升级请求,包括适当的标头。此外,由于 WebSocket 连接是长寿命的,与 HTTP 使用的典型短寿命连接相反,反向代理需要允许这些连接保持打开状态,而不是因为它们似乎空闲而关闭它们。
Edit-1 - Nginx 和直接 NodeJS 之间的连接比较
所以最后我做了一些测试来确定。在 3000 上启动了一个 socket.io 应用,在 80 上启动了 nginx 来转发请求到 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 时,连接数总是更高
【讨论】: