微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用HAProxy负载平衡与Tornado应用程序的WebSocket连接?

我正在使用一个使用websocket处理程序的Tornado应用程序.我正在使用Supervisord运行应用程序的多个实例,但是我无法平衡websocket连接.

我知道Nginx不支持处理开箱即用的websockets,但我按照http://www.letseehere.com/reverse-proxy-web-sockets中的说明使用Nginx tcp_proxy模块来反转代理websocket连接.但是,这不起作用,因为模块无法路由websocket url(例如:ws:// localhost:80 / something).所以它不适用于我在Tornado应用程序中定义的URL路由.

从我对网络的研究来看,似乎HAProxy是对我的websocket连接进行负载均衡的方法.但是,我很难找到任何体面的指导来设置HAProxy来加载平衡websocket连接,并且还能够处理websocket URL路由.

我真的很感激有关如何实现这一目标的一些详细指示.我也完全接受其他解决方案.

解决方法:

在haproxy中实现WebSocket并不困难,不过我承认在这方面找到doc并不容易(希望这个响应会成为一个例子).如果您正在使用haproxy 1.4(我认为您是这样),那么它就像任何其他HTTP请求一样,无需执行任何操作,因为haproxy可以识别HTTP升级.

如果要将WebSocket流量定向到与其余HTTP不同的服务器场,则应使用内容切换规则,简而言之:

 frontend pub-srv
    bind :80
    use_backend websocket if { hdr(Upgrade) -i WebSocket }
    default_backend http

 backend websocket
    timeout server 600s
    server node1 1.1.1.1:8080 check
    server node2 2.2.2.2:8080 check

 backend http
    timeout server 30s
    server www1 1.1.1.1:80 check
    server www2 2.2.2.2:80 check

如果您使用的是1.5-dev,您甚至可以指定“超时隧道”以使WS连接的超时比正常的HTTP连接更长,这样可以避免在客户端使用过长的超时.

您还可以将Upgrade:WebSocket组合成一个特定的URL:

 frontend pub-srv
    bind :80
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_ws_url path /something1 /something2 /something3
    use_backend websocket if is_websocket is_ws_url
    default_backend http

最后,请不要使用我们有时看到的愚蠢的24小时空闲超时,它绝对没有
现在就建立会议等待客户24小时的感觉.网络更多
移动比80年代和连接都非常短暂.你最终会得到许多FIN_WAIT套接
徒劳无功.目前的互联网已经有10分钟了.

希望这有帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐