HAProxy + WebSocket Disconnection

随声附和 提交于 2019-11-26 12:42:17

Upgrade to latest version of socket.io (0.6.8 -> npm install socket.io@0.6.8, which is patched to work with HAProxy) and download the latest version of HAProxy.

Here is an example config file:

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

It's likely that your client is using WebSockets version 76. In which case you can't use "mode http" because the WebSockets handshake violates HTTP. There seems to be ambivalence in the committee about whether the WebSockets handshake should be compatible with HTTP or not. Anyways, the problem with the v76 handshake is that raw data is sent with the handshake (the checksum chunk).

The relevant HAProxy discussion: http://www.mail-archive.com/haproxy@formilux.org/msg03046.html

From the discussion it sounds like there might be a way to default to TCP mode and fall back to HTTP for non-WebSockets connections.

We are using a Netty implementation https://github.com/ibdknox/socket.io-netty and here is the HAProxy file that worked for us. The trick to get it not to fall back to XHR-Polling but use Websockets is putting HAProxy into TCP mode. 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

Where 1.1.1.1 is your IPs

Try using Socket.io instead of node-websockets-server, it's an abstraction layer with fallbacks to many different methods of instant communication between browser and server.

Whilst it's true WebSockets violate HTTP 1.0, they do not violate HTTP 1.1, so you should be able to proxy them with any server capable of proxying HTTP 1.1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!