Parece estar “aleatoriamente” alternando entre o backend combinado acl e o backend padrão

3

Eu tenho o HAProxy agindo como um proxy na frente de:

  • Uma instância do NGinx
  • Um balanceador de carga interno na frente de vários serviços dinâmicos expostos com o socket.io (websockets)

Meu problema é que de tempos em tempos minhas conexões são intermediadas por proxy para o meu cluster socket.io, e então aleatoriamente cai para o roteamento para o NGinx que obviamente é chato e sem sentido, já que o NGinx não é capaz de manipular o pedido. .

Isso acontece quando solicitamos URLs do formato:

http://mydomain.com/backends/*

Há uma ACL na configuração HAProxy para corresponder ao caminho '/ backends / *'.

Aqui está uma versão simplificada da minha configuração HAProxy (removidas entradas extras não relacionadas e nomes alterados):

global
    daemon
    maxconn 4096
    user haproxy
    group haproxy
    nbproc 4 

defaults
    mode http
    timeout server 86400000
    timeout connect 5000
    log global


#this frontend interface receives the incoming http requests
frontend http-in
    mode http

    #process all requests made on port 80
    bind *:80

    #set a large timeout for websockets
    timeout client 86400000

    # Default Backend
    default_backend www_backend

    # Loadfire (socket cluster)
    acl is_loadfire_backends path_beg /backends
    use_backend loadfire_backend if is_loadfire_backends


# NGinx backend
backend www_backend
    server www_nginx localhost:12346 maxconn 1024


# Loadfire backend
backend loadfire_backend
    option forwardfor # This sets X-Forwarded-For
    option httpclose
    server loadfire localhost:7101 maxconn 2048

É realmente muito confuso para mim por que o comportamento parece ser "aleatório", já que ser difícil de reproduzir é difícil de depurar.

Eu aprecio qualquer ideia sobre isso.

    
por AaronO 02.11.2012 / 21:30

1 resposta

0

O problema foi causado pelo fato de que, quando várias solicitações HTTP são transportadas pela mesma conexão TCP, a primeira solicitação passa pelo processo de correspondência acl e pela alternância de contexto para obter um back-end, mas não para as conexões a seguir.

Para corrigir o problema, deve-se seguir um dos seguintes itens na seção frontend:

option httpclose

ou

option http-server-close

O acima funcionou para mim (eu escolhi o último, http-server-close).

Eu achei esta entrada de documentação muito útil: Documentação HAProxy no Google Docs para http-close-server (as outras entradas também são úteis).

    
por 02.11.2012 / 23:58