【问题标题】:A websocket via nginx proxy?通过 nginx 代理的 websocket?
【发布时间】:2023-03-11 06:00:01
【问题描述】:

您好我有一个问题~我想使用 nginx 代理来分发 websocket 连接到其他端口。像这样。

客户端 ====> 代理 =====> ws 服务器

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

客户端 === 代理 ==== ws 服务器

或者

客户端 ===== ws 服务器

谢谢~~~

【问题讨论】:

    标签: nginx websocket


    【解决方案1】:

    您不会这样跳过代理。代理代表您建立连接。请参阅以下来自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 时,连接数总是更高

    【讨论】:

    • 谢谢~但是 websocket 隧道通过代理到客户端。这意味着 nginx 应该打开 tcp 以连接客户端和 ws 服务器。如果我有 1000 个 websocket 连接,nginx 将创建 1000 个 tcp。如果我们有 2 个 ws 服务器,这意味着 ws 服务器将创建 500 个 tcp ???对吗?
    • 我认为是的,但我现在对此没有非常深刻的理解,无法坚定地说是。
    • 是的~当我们使用 nginx 时,tcp 连接总是更高。谢谢~你~
    • 很好,如果它回答了您的问题,请接受它作为答案
    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2020-04-19
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多