2010-12-05 13 views
43

Ich verwende HAProxy, um Anfragen in einer Subdomain an eine node.js-App zu senden.HAProxy + WebSocket-Trennung

Ich kann WebSockets nicht funktionieren. Bis jetzt konnte ich den Client nur dazu bringen, eine WebSocket-Verbindung herzustellen, aber dann folgt eine Verbindungsunterbrechung, die sehr bald folgt.

Ich bin auf Ubuntu. Ich habe verschiedene Versionen von socket.io und node-websocket-server verwendet. Der Client ist entweder die neueste Version von Safari oder Chrome. HAProxy Version ist 1.4.8

Hier ist meine 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 

ich die Web-und Mailing-Liste surften haben, aber nicht bekommen kann eine der vorgeschlagenen Lösungen zu arbeiten.

(ps dies für serverfault sein könnte, aber es gibt auch andere HAProxy Frage auf SO, so habe ich gewählt, um eine Nachricht schreiben)

Antwort

60

-Upgrade auf die neueste Version von socket.io (0,6 Lage sein sollte. 8 ->npm install [email protected], die mit HAProxy gepatcht wurde) und laden Sie die neueste Version von HAProxy. Hier

ein Beispiel einer Konfigurationsdatei:

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 
+0

Welche Version von HAProxy verwenden Sie? – Diego

+0

@Diego können Sie jede Version verwenden> 1.4 –

+0

Ermöglicht dies Sticky-Sitzungen mit Authentifizierung? Ich habe eine separate Frage für das Problem hinzugefügt: http://stackoverflow.com/q/8149038/152541 – Diego

5

Es ist wahrscheinlich, dass Ihr Kunde WebSockets Version 76. In diesem Fall können Sie‘verwendet t "Modus http" verwenden, da der WebSockets-Handshake gegen HTTP verstößt. Im Ausschuss scheint es Ambivalenz zu geben, ob der WebSockets-Handshake mit HTTP kompatibel sein soll oder nicht. Wie auch immer, das Problem mit dem v76-Handshake ist, dass Rohdaten mit dem Handshake gesendet werden (der Checksum Chunk).

Die relevante HAProxy Diskussion: http://www.mail-archive.com/[email protected]/msg03046.html

Aus der Diskussion, es klingt wie es könnte ein Weg sein, um TCP-Modus auf dem Standard und zurück zu HTTP für Nicht-WebSockets Verbindungen fallen.

+0

Große Info. Klingt so, als ob es einen Wunsch gäbe, WebSockets von Port 80 zu haben, die ich hier zu erreichen versuche. Wird in den TCP-Layer-4-Modus schauen. – Ross

+0

@Ross, bitte posten Sie zurück, was Sie finden. Oder wenn Sie nicht zu einer anderen Lösung kommen, können Sie diese Antwort auswählen, damit jeder, der nach dem gleichen Problem sucht, weiß, dass beim Durchsuchen der Fragenliste eine Lösung vorhanden ist. – kanaka

+0

Ja, wird es tun ... – Ross

-1

Versuchen Sie Socket.io anstelle von Knoten-Websockets-Server, es ist eine Abstraktionsschicht mit Fallbacks zu vielen verschiedenen Methoden der sofortigen Kommunikation zwischen Browser und Server.

Zwar WebSockets ist verletzen HTTP 1.0, sie nicht verletzen HTTP 1.1, so dass Sie Proxy sie mit jedem Server, der Proxy-HTTP 1.1

4

Wir sind mit einer Netty Implementierung https://github.com/ibdknox/socket.io-netty und hier ist die HAProxy-Datei, die für uns gearbeitet. Der Trick, es nicht auf XHR-Polling zurückgreifen zu lassen, sondern WebSockets zu verwenden, setzt HAProxy in den TCP-Modus. HAProxy config:

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 

Wo 1.1.1.1 ist Ihr IPs