Implementación de un Clúster de Balanceo de Carga con HAProxy
- Introducción a HAProxy
- Soporte para balanceo de carga en capas 4 y 7
- Funcionalidades de ACL para control de acceso
- Interfaz de monitoreo gráfico
- Múltiples algoritmos de programación
- Algoritmos de Balanceo
- Archivo de Configuración Principal
- Implementación Práctica de Balanceo de Carga
1. Preparación del Entorno
- Cuatro servidores web y un servidor proxy
# Servidores 61 62 63 64
# Servidor proxy en puerto 80
- Editar páginas web en cada uno de los cuatro servidores
2. Configuración del Sevridor Proxy
[root@proxy haproxy]# yum -y install haproxy.x86_64
[root@proxy haproxy]# cat haproxy.cfg
#---------------------------------------------------------------------
# Ejemplo de configuración para una aplicación web posible. Consulte
# las opciones de configuración completas en línea.
#
# https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
maxconn 4000
defaults
mode http
log global
option httplog
option dontlognull
retries 3
timeout http-request 5s
timeout queue 1m
timeout connect 5s
timeout client 1m
timeout server 1m
timeout http-keep-alive 5s
timeout check 5s
maxconn 3000
frontend principal
bind *:80
default_backend backend_http
backend backend_http
balance roundrobin
servidor nodo1 127.0.0.1:5001 check
servidor nodo2 127.0.0.1:5002 check
servidor nodo3 127.0.0.1:5003 check
servidor nodo4 127.0.0.1:5004 check(Realiza verificación de salud, configurado en la sección default)
[root@proxy haproxy]#
- Descripción de parámetros específicos
frontend principal # Nombre de la sección frontend, modificable
bind *:80 # Puerto de escucha en el servidor proxy
default_backend backend_http # Enrutamiento de solicitudes al grupo backend
backend backend_http # Grupo de servidores web
balance roundrobin # Algoritmo de balanceo, round-robin
servidor nodo1(Nombre del servidor web) 127.0.0.1:5001 check
servidor nodo2 127.0.0.1:5002 check
servidor nodo3 127.0.0.1:5003 check
servidor nodo4 127.0.0.1:5004 check
- Archivo de configuración modificado
frontend principal
bind *:80
default_backend backend_http
backend backend_http
balance roundrobin
servidor nodo1 192.168.200.61:80 check
servidor nodo2 192.168.200.62:80 check
servidor nodo3 192.168.200.63:80 check
servidor nodo4 192.168.200.64:80 check
[root@proxy haproxy]# systemctl restart haproxy.service
[root@proxy haproxy]# netstat -pant|grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2563/haproxy
3. Pruebas desde el Cliente
- Aceder al servidor proxy
- El puerto 80 del servidor proxy lee su archivo de configuración y envía solicitudes al grupo back end
- Distribuyendo entre los servidores backend
[root@proxy haproxy]# curl 192.168.200.80
63
[root@proxy haproxy]# curl 192.168.200.80
64
[root@proxy haproxy]# curl 192.168.200.80
61
[root@proxy haproxy]# curl 192.168.200.80
62
- Separación de Tráfico con ACL en HAProxy
- Enviar solicitudes del cliente a diferentes grupos de servidores para balanceo de carga
- Dividir los cuatro servidores en dos grupos de trabajo
- Solicitudes HTML procesadas por servidores 61,62
- Solicitudes PHP (dinámicas) manejadas por servidores 63,64
- Configurar diferentes páginas según el tipo de solicitud
- Controlar las solicitudes para dirigirlas a servidores específicos
1. Configurar nginx para procesar scripts PHP
# Detener servicios apache en servidores 63 y 64
# Configurar nginx en servidores 63,64
# Implementar procesamiento de scripts PHP
# Permitir acceso a index.php
location / {
root html;
index index.php index.html index.htm;
}
# Descomentar
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
# Configurar igual en servidor 64
# Instalar paquetes necesarios
[root@httpd-63 yum.repos.d]# yum -y install php php-devel php-fpm
# Modificar archivo para usar escucha en puerto 9000
[root@httpd-63 php-fpm.d]# pwd
/etc/php-fpm.d
38 ;listen = /run/php-fpm/www.sock
39 listen = 127.0.0.1:9000
# Iniciar servicio php-fpm
[root@httpd-63 php-fpm.d]# netstat -pant|grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 3748/php-fpm: maste
# Crear página PHP
[root@httpd-63 html]# pwd
/usr/share/nginx/html
[root@httpd-63 html]# cat index.php
<?php
echo "192.168.200.63\n";
?>
# Configurar igual en servidor 64
2. Crear Páginas Web
# Configurar en servidores 61,62 archivo a.html (además de página principal)
# Con contenido diferente
[root@httpd-62 html]# cat a.html
62 a
# Configurar en servidores 63,64 páginas .php
[root@httpd-63 html]# cat a.php
<?php
echo "63 a \n";
?>
3. Configurar ACL en HAProxy
- Múltiples ACLs identificadas por nombres
frontend principal
bind *:80
default_backend backend_http
acl paginas_html(nombre) path_end(basado en extensión de archivo) .html
acl paginas_php path_end .php
use_backend grupo_html if paginas_html
use_backend grupo_php if paginas_php
# Solicitudes a localhost se envían a servidores 61 62
backend backend_http
balance roundrobin
servidor nodo1 192.168.200.61:80 check
servidor nodo2 192.168.200.62:80 check
# Solicitudes a localhost/a.html se envían a servidores 61 62
backend grupo_html
balance roundrobin
servidor nodo1 192.168.200.61:80 check
servidor nodo2 192.168.200.62:80 check
# Solicitudes a localhost/a.php se envían a servidores 63 64
backend grupo_php
balance roundrobin
servidor nodo3 192.168.200.63:80 check
servidor nodo4 192.168.200.64:80 check
4. Pruebas desde el Cliente
[root@proxy haproxy]# curl localhost
61
[root@proxy haproxy]# curl localhost
62
[root@proxy haproxy]# curl localhost/a.html
61 a
[root@proxy haproxy]# curl localhost/a.html
62 a
[root@proxy haproxy]# curl localhost/a.php
64 a
[root@proxy haproxy]# curl localhost/a.php
63 a
5. Puntos Clave
- Las ACLs tienen múltiples reglas de coincidencia, path_end coincide con extensiones de archivo
- También existen otros tipos de ACL:
- ACL basada en dirección IP
- ACL basada en ruta URL
- ACL basada en puerto
- ACL basada en cabeceras de solicitud
- Entre otros
- Activar la Interfaz Web de HAProxy ====================================
- Modificar el archivo de configuración para habilitar la interfaz web
- Proporciona una página de estado con estadísticas de acceso
- Utiliza una sección listen para definir el puerto
# Agregar al final del archivo
listen pagina_monitor
bind 0.0.0.0:8088 # Puerto de escucha
mode http
stats refresh 5s # Intervalo de actualización
stats uri /stats
stats auth admin:123456
# Reiniciar servicio haproxy
192.168.200.80:8088/stats
- Observar los colores diferentes que indican estados distintos
- Detener servicio en servidor 61 para ver cambio a color rojo