【问题标题】:Nginx + Express + Socket.IO workaroundsNginx + Express + Socket.IO 解决方法
【发布时间】:2013-01-25 02:06:22
【问题描述】:

目前我们知道 nginx 稳定版不能代理 tcp 连接。因此,如果 express 和 socket.io 可以在同一个端口上工作,我们需要使用其他代理解决方案。

但是还有其他方法可以绕过这个问题:

  1. 如果我们将 socket.io 设置为监听不同的端口,然后 express 监听。例如:nginx代理80端口到8000端口,express监听8000端口,socket.io监听8001端口,客户端直接连接socket.io到8001端口。
  2. 使用nginx_tcp_proxy_module我们可以代理tcp连接,但是我们不能在同一个端口上使用http。所以我们使用这样的解决方案:nginx代理80端口到8000端口,81端口(用于websockets)到8001,express监听8000端口,socket.io监听8001端口,客户端连接socket.io到81端口。

这些方法有什么优缺点?

【问题讨论】:

    标签: node.js nginx express socket.io


    【解决方案1】:

    我更喜欢在前面使用Haproxy,并且只有一个公共开放端口。 “生根”是按路径完成的。

    配置看起来像这样(您可以轻松找到许多教程/资源)

    frontend all 0.0.0.0:80
    
        acl is_websocket path_beg /websocket/
        use_backend nodejs if is_websocket
        default_backend nginx
    
    backend nodejs
       server srv_node 127.0.0.1:16852
    
    backend nginx
       balance roundrobin
       server srv_static 127.0.0.1:8080
    

    【讨论】:

    • 是的,我知道 Haproxy 被用作解决此问题的方法。但我需要知道我提出的解决方案的缺点。
    • 我不熟悉 nginx tcp 模块,但我认为以这种方式代理您的 websocket 没有任何优势,除非您想做一些负载平衡。我使用非标准端口(80 和 8080 除外)的唯一问题是某些公司或个人防火墙/代理会阻止流量。
    • 一些公司或个人的防火墙/代理会阻止流量 - 是的,我知道。我想也许 cookie 会有一些问题或更严重的问题。
    • 没有您的 cookie 将在端口 id 之间共享,您在设置它们时不精确端口。您可能遇到的唯一问题可能是 nginx 的超时。
    【解决方案2】:

    你可以用 Varnish 和 Nginx 做到这一点 - http://blog.dealspotapp.com/post/40923117591/websockets-with-varnish-and-multiple-nginx-backends

    或使用 Haproxy - http://blog.dealspotapp.com/post/41226162147/websockets-with-haproxy-ssl-and-multiple-backends

    如果您使用 Haproxy,请确保将隧道超时设置为较长的​​值,例如 1 天。否则你会看到每隔几秒就会创建新的套接字。

    【讨论】:

    • 我知道如何使用 Haproxy 和 Varnish :)。这个问题与标准解决方法无关。我需要知道我提出的解决方案的缺点。
    • 我实际上认为使用 Haproxy 不是一种变通方法,而是一种更好的解决方案,您可以更好地控制一切,并且可以对 Websocket 连接进行负载平衡(使用 Varnish 方法无法做到)
    猜你喜欢
    • 2012-04-11
    • 2019-07-05
    • 1970-01-01
    • 2016-09-09
    • 2016-12-17
    • 2021-04-10
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多