HAProxy + WebSocket断开连接
我正在使用HAProxy将子域上的请求发送到node.js应用程序。
我无法让WebSockets工作。 到目前为止,我只能够让客户端build立一个WebSocket连接,但之后会有一个断开连接。
我在Ubuntu上。 我一直在使用各种版本的socket.io
和node-websocket-server
。 客户端是最新版本的Safari或Chrome。 HAProxy版本是1.4.8
这是我的HAProxy.cfg
global maxconn 4096 pidfile /var/run/haproxy.pid daemon defaults mode http maxconn 2000 option http-server-close option http-pretend-keepalive contimeout 5000 clitimeout 50000 srvtimeout 50000 frontend HTTP_PROXY bind *:80 timeout client 86400000 #default server default_backend NGINX_SERVERS #node server acl host_node_sockettest hdr_beg(host) -i mysubdomain.mydomain use_backend NODE_SOCKETTEST_SERVERS if host_node_sockettest backend NGINX_SERVERS server THIS_NGINX_SERVER 127.0.0.1:8081 backend NODE_SOCKETTEST_SERVERS timeout queue 5000 timeout server 86400000 server THIS_NODE_SERVER localhost:8180 maxconn 200 check
我已经拖网和邮件列表,但不能得到任何build议的解决scheme的工作。
(ps这可能是serverfault,但也有其他的HAProxy问题,所以我select在这里发表)
升级到最新版本的socket.io(0.6.8 – > npm install socket.io@0.6.8
,修补了HAProxy),并下载最新版本的HAProxy。
这是一个示例configuration文件:
global maxconn 4096 # Total Max Connections. This is dependent on ulimit nbproc 2 defaults mode http frontend all 0.0.0.0:80 timeout client 5000 default_backend www_backend acl is_websocket hdr(Upgrade) -i WebSocket acl is_websocket hdr_beg(Host) -i ws use_backend socket_backend if is_websocket backend www_backend balance roundrobin option forwardfor # This sets X-Forwarded-For timeout server 5000 timeout connect 4000 server server1 localhost:8081 weight 1 maxconn 1024 check server server2 localhost:8082 weight 1 maxconn 1024 check server server3 localhost:8083 weight 1 maxconn 1024 check backend socket_backend balance roundrobin option forwardfor # This sets X-Forwarded-For timeout queue 5000 timeout server 5000 timeout connect 5000 server server1 localhost:8081 weight 1 maxconn 1024 check server server2 localhost:8082 weight 1 maxconn 1024 check server server3 localhost:8083 weight 1 maxconn 1024 check
您的客户端可能使用的是WebSockets版本76.在这种情况下,您不能使用“模式http”,因为WebSockets握手违反了HTTP。 委员会似乎对WebSockets握手是否应该与HTTP兼容表示矛盾。 无论如何,v76握手的问题是原始数据与握手(校验和块)一起发送。
相关的HAProxy讨论: http : //www.mail-archive.com/haproxy@formilux.org/msg03046.html
从讨论中,听起来好像有一种方法可以默认为TCP模式,并回到非WebSockets连接的HTTP模式。
我们正在使用Netty实现https://github.com/ibdknox/socket.io-netty ,这里是为我们工作的HAProxy文件。 诀窍是让它不回落到XHR轮询,但使用Websockets是把HAProxy到TCP模式。 HAProxyconfiguration:
global daemon maxconn 32000 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms listen http-in bind *:80 server server1 1.1.1.1:8000 check server server2 1.1.1.1:8000 check listen socketio-in mode tcp bind *:8080 balance source timeout queue 5000 timeout server 86400000 timeout connect 86400000 server server1 1.1.1.1:8080 check server server2 1.1.1.1:8080 check
1.1.1.1是你的IP
尝试使用Socket.io而不是node-websockets-server,它是一个抽象层,具有对浏览器和服务器之间即时通信的许多不同方法的回退。
虽然WebSockets违反了HTTP 1.0,但它们并不违反HTTP 1.1,因此您应该能够使用任何能够代理HTTP 1.1的服务器来代理它们