Eu não consegui fazer isso funcionar no modo tcp, mas se você mudar para o modo http, você obtém o 503
defaults
mode http
Estou testando a execução do HAProxy como um balanceador de carga dedicado por trás do Apache 2.2, substituindo nossa configuração atual onde usamos o balanceador de carga do Apache. Em nossa configuração atual, somente Apache, se todos os servidores backend (origem) estiverem inativos, o Apache exibirá uma mensagem 503 serviço indisponível. Com o HAProxy, recebo uma resposta de gateway 502 ruim.
Estou usando uma regra simples de reconfiguração de proxy reverso no Apache
RewriteRule ^/(.*) http://127.0.0.1:8000/$1 [last,proxy]
No HAProxy eu tenho o seguinte (executando no modo tcp padrão)
defaults
log global
option tcp-smart-accept
timeout connect 7s
timeout client 60s
timeout queue 120s
timeout server 60s
listen my_server 127.0.0.1:8000
balance leastconn
server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
Testando a conexão direta ao balanceador de carga quando os servidores de back-end estão inativos:
[root@dev ~]# wget http://127.0.0.1:8000/ test.html
--2012-05-28 11:45:28-- http://127.0.0.1:8000/
Connecting to 127.0.0.1:8000... connected.
HTTP request sent, awaiting response... No data received.
Então, presumivelmente, isso se deve ao fato de que o HAProxy aceita a conexão e depois a fecha.
No modo TCP, o haproxy não emite nenhum código de status, então o único ponto restante é claramente o apache. Eu acho que é simplesmente porque o haproxy aceita então fecha a conexão que faz o apache retornar um 502, o que é esperado.
Portanto, o comportamento que você está observando está correto. De qualquer forma, geralmente é melhor trabalhar no modo HTTP. Sugiro também que você ative a "opção httplog", que fornecerá logs muito detalhados, e "option http-server-close" para aproveitar a capacidade do apache de manter o keep-alive com haproxy, reduzirá significativamente o consumo de portas de origem local na máquina.