2010-12-05 81 views
43

我正在使用HAProxy将子域上的请求发送到node.js应用程序。HAProxy + WebSocket断开

我无法让WebSockets工作。到目前为止,我只能够让客户端建立一个WebSocket连接,但之后会有一个断开连接。

我在Ubuntu。我一直在使用各种版本的socket.ionode-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 

我搜罗网页和邮件列表,但不能得到任何建议的解决方案的工作。

(PS这可能是serverfault,但也有上的其他HAProxy的问题,所以我选择在这里发布)

回答

60

升级代理他们。 8 - >npm install [email protected],修补程序可与HAProxy配合使用) 并下载最新版本的HAProxy。

下面是一个例子配置文件:

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 
5

这可能是因为你的客户使用的WebSockets版本76.在这种情况下,你可以” t使用“模式http”,因为WebSockets握手违反了HTTP。委员会似乎对WebSockets握手是否应与HTTP兼容存在矛盾。无论如何,v76握手的问题是原始数据与握手(校验和块)一起发送。

相关HAProxy的讨论:http://www.mail-archive.com/[email protected]/msg03046.html

从它听起来像有可能是一种方式默认为TCP模式,并回落到HTTP非的WebSockets连接的讨论。

+0

伟大的信息。听起来像有一个愿望,我想在这里完成80端口的websockets。将查看TCP层4模式。 – Ross 2010-12-06 11:55:42

+0

@Ross,请回复你发现的内容。或者,如果您未找到其他解决方案,您是否可以选择此答案,以便搜索同一问题的其他人知道在扫描问题列表时存在解决方案。 – kanaka 2010-12-06 15:05:38

-1

尝试使用Socket.io代替节点的WebSockets的服务器,它是一个抽象层以回退到浏览器和服务器之间的即时通信的许多不同的方法。

虽然它是真实的WebSockets违反HTTP 1.0,只要不违反HTTP 1.1,所以你应该能够一起socket.io的最新版本(0.6能够代理HTTP的任何服务器1.1

4

我们正在使用的Netty实现https://github.com/ibdknox/socket.io-netty这里是对我们工作的HAProxy的文件。让它不回退到XHR-Polling但使用Websockets的技巧是将HAProxy放入TCP模式。 HAProxy的配置:

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地址

相关问题