
Soy nuevo en este escenario de equilibrio de carga y se me ha asignado la tarea de descubrir cómo hacer que funcione este equilibrio de carga.
Mi entorno:
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
Intentando ejecutar una prueba en el laboratorio antes de la producción con HAproxy y keepalived. Esto es lo que tengo en mi configuración keepalived:
! Archivo de configuración 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
}
}
y aquí está mi configuración para 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
Cuando inicié HAproxy, recibí este error y no estoy muy seguro de por dónde empezar a buscar para solucionarlo. ¿Quizás alguien que haya hecho esto muchas veces pueda ayudarme a arrojar algo de luz?
503 Service Unavailable No server is available to handle this request.
Sin embargo, conectarse manualmente al servidor web1 y al servidor web2 funciona bien.
Todo lo que quiero es un simple equilibrio de carga para el servidor web que se encuentra detrás de HAproxy. Cualquier consejo o sugerencia es absolutamente apreciado. ¿Por favor ayuda? Muchas gracias.
Respuesta1
Nunca he usado HAproxy, pero una búsqueda rápida me lleva a pensar que debes agregarlo default_backend app
inmediatamente debajo frontend main *:80
. No veo ninguna parte en esa configuración que conecte el backend y el frontend.
Respuesta2
El problema está en su configuración de HAProxy. Cuando elimine todos los comentarios de su configuración, obtendré esto:
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
Y ahora puedes ver claramente que no hay ninguna configuración de interfaz. Las solicitudes llegan a HAProxy a través de HAProxy frontend main
, pero no sabe qué servidores son confiables para manejarlas, por lo que devolverá 503.
Tienes que vincular el backend al frontend con default_backend
o con acl.
También deberías usar estadísticas, no sólo con socket sino también con interfaz web protegida. Puedo mostrarle información sobre los clústeres detrás de haproxy, qué servidores están fuera de línea, cuáles tienen algún problema, sobre los tiempos de respuesta, etc. Muy útil para depurar.
Respuesta3
Respuesta4
PFSense agrega automáticamente (y de manera algo invisible) ACL adicionales de forma predeterminada cuando usa un certificado TLS. Agregué un segundo host virtual y un segundo certificado usando la sección "Certificados adicionales". Esto dejó las ACL de certificado predeterminadas en su lugar.
Deshabilitar estas ACL y reiniciar funcionó.