2010-12-05 92 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地址