Ami*_*deh 4 proxy nginx tornado haproxy 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分钟了.
希望这有帮助!
| 归档时间: |
|
| 查看次数: |
4344 次 |
| 最近记录: |