Alternar HAProxy para backup com 500 erros e / ou servidor inoperante

8

Estou configurando um HAProxy na frente de apenas 2 servidores back-end, com uma configuração específica: qualquer solicitação deve ir para o servidor A; mas, se o servidor A retornar um código de erro 5xx, todas as solicitações deverão ir para um servidor de backup B. Quando A retornar "ativo", todas as solicitações deverão ir para A.

Estou tentando esta configuração:

backend example_cluster
        balance roundrobin
        option httpclose
        option forwardfor

        option httpchk HEAD /ping.html HTTP/1.0\r\nHost:www.example.com
        http-check disable-on-404
        default-server error-limit 1 on-error mark-down

        redirect scheme https if !{ ssl_fc }
        server node1 1.2.3.4:80 check observe layer7
        server node_back 5.6.7.8:443 backup ssl verify none

Mas isso não funciona por dois motivos:

  1. Todas as solicitações são roteadas para o servidor node_back (B), mesmo se o node1 (A) estiver ativo.
  2. Parece que nenhum httpchecks é realizado no servidor A; ou melhor, no syslog não vejo nenhum erro em relação ao servidor A inativo.

Se eu remover a linha "opção httpchk" e as duas linhas logo abaixo; e removo também o "observe layer7" no servidor A; O HAProxy funciona roteando todas as solicitações para o nó A. Mas, obviamente, quando o servidor A retorna 500, o HAProxy não muda para B. Portanto, estou assumindo que o problema possa estar na opção httpchk configuration.

Carmine Giangregorio
fonte
1
É perfeitamente possível com o nginx. Na verdade, estou evitando haproxy no balanceamento da web, porque o nginx é mais flexível e simples, pois é um servidor da web. Mas, como a pergunta inicial era sobre haproxy, não sinto o direito de fornecer uma resposta sobre o nginx. Mas se você quiser, eu posso. Afinal, quase um ano se passou, acho que você encontrou uma solução de qualquer maneira.
drookie

Respostas:

1

Da documentação oficial: Balanceamento de carga passivo ativo com HAProxy

defaults
  mode http
  option http-server-close
  timeout client 20s
  timeout server 20s
  timeout connect 4s

frontend ft_app
  bind 10.0.0.100:80 name app
  default_backend bk_app

backend bk_app
  server s1 10.0.0.1:80 check
  server s2 10.0.0.2:80 check backup
user5994461
fonte
0

A propósito, eu encontrei a configuração pré-nginx para o meu haproxy, e acho que você deveria experimentá-lo:

frontend foo
    bind 192.168.0.1:9080
    option httpchk
    default_backend bar-web

backend bar-web
    mode http
    balance roundrobin
    server bar1 192.168.1.2:9080 check observe layer4 weight 50
    server bar2 192.168.1.3:9080 check observe layer4 weight 50
drookie
fonte