2010-12-05 17 views
43

Estoy usando HAProxy para enviar solicitudes, en un subdominio, a una aplicación node.js.HAProxy + WebSocket Desconexión

No puedo hacer que WebSockets funcione. Hasta ahora solo he podido lograr que el cliente establezca una conexión WebSocket, pero luego hay una desconexión que sigue muy poco después.

Estoy en ubuntu. He estado usando varias versiones de socket.io y node-websocket-server. El cliente es las últimas versiones de Safari o Chrome. HAProxy versión 1.4.8 es

Aquí está mi 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 

He rastreado la lista de web y correo pero no puedo conseguir ninguna de las soluciones sugeridas para trabajar.

(ps esto podría ser para serverfault, pero hay otra pregunta HAProxy el SO, por lo que han optado por publicar aquí)

Respuesta

60

de actualización a la última versión de socket.io (0.6. 8 ->npm install [email protected], que está parcheado para trabajar con HAProxy) y descargue la última versión de HAProxy.

Aquí es un archivo de configuración de ejemplo:

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

¿Qué versión de HAProxy estás usando? – Diego

+0

@Diego puede usar cualquier versión> 1.4 –

+0

¿Esto permite sesiones adhesivas con autenticación? He agregado una pregunta por separado para el problema: http://stackoverflow.com/q/8149038/152541 – Diego

5

Es probable que su cliente está utilizando WebSockets versión 76. En este caso se puede' t use "modo http" porque el protocolo de enlace WebSockets infringe HTTP. Parece que hay una ambivalencia en el comité sobre si el protocolo de enlace WebSockets debe ser compatible con HTTP o no. De todos modos, el problema con el apretón de manos v76 es que los datos brutos se envían con el apretón de manos (el fragmento de suma de comprobación).

La discusión relevante HAProxy: http://www.mail-archive.com/[email protected]/msg03046.html

De la discusión que suena como que podría ser una forma de defecto en el modo TCP y caer de nuevo a HTTP para las conexiones no WebSockets.

+0

gran información. Parece que hay un deseo de tener websockets fuera del puerto 80 que estoy tratando de lograr aquí. Se verá en el modo de capa 4 de TCP. – Ross

+0

@Ross, publique nuevamente lo que encuentre. O bien, si no llega a otra resolución, puede seleccionar esta respuesta para que cualquier otra persona que busque el mismo problema sepa que hay una resolución al escanear la lista de preguntas. – kanaka

+0

Sí, haré ... – Ross

-1

Pruebe usar Socket.io en lugar de node-websockets-server, es una capa de abstracción con errores en muchos métodos diferentes de comunicación instantánea entre el navegador y el servidor.

Si bien es cierto WebSockets violan HTTP 1.0, que no violen HTTP 1.1, por lo que debe ser capaz de ellos proxy con cualquier servidor proxy HTTP capaz de 1.1

4

Estamos utilizando una aplicación Netty https://github.com/ibdknox/socket.io-netty y aquí está el archivo HAProxy que trabajó para nosotros. El truco para conseguir que no vuelva a recurrir a XHR-Polling, sino que utilice Websockets, es poner HAProxy en modo TCP. config 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 

Dónde 1.1.1.1 es sus IPs