Eu nunca usei o HAproxy, mas uma pesquisa rápida me leva a pensar que você precisa adicionar default_backend app
imediatamente abaixo de frontend main *:80
. Não vejo nada nessa configuração conectando o backend e o frontend juntos.
Sou novo nesse cenário de balanceamento de carga e estou sendo encarregado de descobrir como fazer esse balanceamento de carga funcionar.
Meu ambiente:
Centos 6.4 64 Bit
Webserver: Lighttpd
All running in ESXI
virtual IP: 192.168.1.6
LB1: 192.168.1.4
LB2: 192.168.1.5
Webserver 1: 192.168.1.12
Webserver 2: 192.168.1.13
Gateway: 192.168.1.1
Tentando executar um teste no laboratório antes da produção com HAproxy e manter a vida ativa. Aqui está o que eu tenho na minha configuração keepalived:
Arquivo de configuração para keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.1.4
smtp_connect_timeout 30
router_id 192.168.1.1
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1 # check every second
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101 #priority 101 for master
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.6
}
track_script {
chk_haproxy
}
}
e aqui está minha configuração para o HAproxy
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
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
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js
# use_backend static if url_static
# default_backend view
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
mode tcp
balance roundrobin
server server1 192.168.1.12:80 check inter 2000 rise 2 fall 5
server server2 192.168.1.13:80 check inter 2000 rise 2 fall 5
Quando iniciei o HAproxy, recebi este erro e não sei ao certo por onde começar a procurar consertá-lo. Talvez alguém que tenha feito isso muitas vezes possa me ajudar a lançar alguma luz?
503 Service Unavailable No server is available to handle this request.
No entanto, a conexão manual ao webserver1 e webserver2 funciona bem.
Tudo que eu quero é apenas um balanceamento de carga simples para o servidor que fica atrás do HAproxy. Qualquer sugestão ou sugestão é absolutamente apreciada. Por favor ajude? Muito obrigado.
O problema está na configuração do HAProxy. Quando eu removo todos os comentários da sua configuração, recebo isto:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
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
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend main *:80
backend app
mode tcp
balance roundrobin
server server1 192.168.1.12:80 check inter 2000 rise 2 fall 5
server server2 192.168.1.13:80 check inter 2000 rise 2 fall 5
E agora você pode ver claramente que não há configuração de frontend. Solicitações chegam ao HAProxy via frontend main
, mas o HAProxy não sabe quais servidores são confiáveis para lidar com isso, então retornará 503.
Você precisa vincular o backend ao frontend com default_backend
ou com acl.
Você deve usar as estatísticas também, não apenas com o soquete, mas também com a interface da Web protegida. Eu posso mostrar informações sobre clusters por trás do haproxy, quais servidores estão offline, quais problemas, tempos de resposta, etc. Muito útil para depuração.
Eu recebi um erro semelhante porque o HAProxy achou que o back-end estava inativo devido à verificação de integridade padrão. Eu desativei a verificação de saúde e o 503 foi embora.
Eu tinha uma configuração ligeiramente diferente, então essa não é a resposta para o seu problema específico, mas pode ajudar outras pessoas a experimentar o erro 503 com o HAProxy.
Meu Haproxy foi configurado assim:
use_backend be_external-service-1-0 if { hdr_beg(host) -i external-service-1-0 }
, o que significa que o back-end só será usado se o cabeçalho do host começar com o serviço externo-1-0.
No meu caso, o motivo do erro 503 foi que o cliente estava enviando os seguintes cabeçalhos de solicitação:
X-App-Id: 98d77fae1082342342323423423452ae203489234
Anfitrião: external-service-1-0.prod-drb-external.svc.cluster.local: 8080 Conexão: Keep-Alive
Observe que há uma linha extra entre o X-App-Id e o Host. Uma linha vazia faz com que o HAProxy acredite que este é o fim dos Cabeçalhos HTTP, portanto ignorou o cabeçalho do Host e não conseguiu encontrar o backend correto.