Aumenta o tempo limite do cliente para conexões WebSocket para determinado URL

2

No Linux do CentOS 7 eu uso com sucesso o HAProxy 1.5.14 na frente do Jetty 9 servindo um Wordpress site via FastCGI .

Funciona muito bem, mas, para um jogo HTML5 / WebSocket no mesmo site, são necessários tempos limites de cliente e servidor muito maiores para conexões WebSocket com a URL /ws/ .

Por isso, modifiquei o arquivo /etc/haproxy/haproxy.cfg para o seguinte:

global
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    tune.ssl.default-dh-param 2048

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m    # HOW TO INCREASE FOR /ws/ ?
    timeout server          1m    # HOW TO INCREASE FOR /ws/ ?
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend public
    bind 144.76.184.151:80
    bind 144.76.184.151:443 ssl crt /etc/pki/tls/certs/slova.de.pem

    acl websocket_url path_end /ws/
    #timeout client 60m if websocket_url   # SYNTAX ERROR
    use_backend ws-jetty if websocket_url
    default_backend jetty

backend jetty
    server domain 127.0.0.1:8080 send-proxy

backend ws-jetty
    timeout client 60m    # IS IGNORED HERE
    timeout server 60m
    server domain 127.0.0.1:8080 send-proxy

Quando eu defino

    timeout client 60m
    timeout server 60m

na seção defaults , meu jogo WebSocket funciona conforme necessário, mas eu não quero tempo limite de 1 hora para as conexões HTTP usuais.

Quando coloco essa seção em backend ws-jetty , o aviso é impresso, esse tempo limite O cliente não é uma opção de back-end e, portanto, é ignorado.

Quando eu tento a linha timeout client 60m if websocket_url , um erro de sintaxe é relatado.

    
por Alexander Farber 12.07.2016 / 12:06

1 resposta

4

If some long-lived sessions are mixed with short-lived sessions (eg: WebSocket and HTTP), it's worth considering timeout tunnel, which overrides timeout client and timeout server for tunnels, as well as timeout client-fin for half-closed connections.

http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-timeout%20client

Quando timeout tunnel está ativo em uma conexão - - o que acontece automaticamente para sockets da web, uma vez que a lógica HTTP é desanexada quando uma conexão é atualizada para um socket da web - - a maioria dos outros timeouts não dispara mais para essa conexão.

Note que este é um temporizador ocioso, não um temporizador de sessão. O timer é redefinido pelo tráfego de qualquer direção. Você pode aplicar isso ao backend ou na seção de padrões. Ele só deve ser realmente usado pelo HAProxy quando apropriado, mas colocá-lo no back-end específico onde ele é necessário é sem dúvida a melhor prática.

    
por 12.07.2016 / 14:24