Cómo configurar HAProxy como Load Balancer para Nginx en CentOS 8


Para garantizar la máxima disponibilidad, escalabilidad y alto rendimiento de las aplicaciones web, ahora es común implementar tecnologías que introducen redundancia, como la agrupación en clústeres de servidores y el equilibrio de carga. Por ejemplo, configurar un clúster de servidores que ejecuten las mismas aplicaciones y luego implementar balanceadores de carga frente a ellos para distribuir el tráfico.

HAProxy es un equilibrador de carga TCP/HTTP de alta disponibilidad, servidor proxy y terminador SSL/TLS de código abierto, potente, confiable, seguro y ampliamente utilizado, creado para sitios web de muy alto tráfico. Funciona de manera confiable en los sistemas operativos Linux, Solaris, FreeBSD, OpenBSD y AIX.

Esta guía muestra cómo configurar un equilibrador de carga de alta disponibilidad dedicado con HAProxy en CentOS 8 para controlar el tráfico en un clúster de servidores web NGINX. También demuestra cómo configurar la terminación SSL/TLS en HAProxy.

Un total de 4 servidores con una instalación mínima de CentOS 8.

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

Paso 1: Configuración del servidor HTTP Nginx en las máquinas cliente

1. Inicie sesión en todas sus máquinas cliente de CentOS 8 e instale el servidor web Nginx usando el administrador de paquetes dnf como se muestra.

# dnf install Nginx

2. A continuación, inicie el servicio Nginx, por ahora, habilítelo para que se inicie automáticamente al arrancar el sistema y confirme que está funcionando verificando su estado, usando los comandos systemctl (haga esto en todas las máquinas cliente).

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. Además, si el servicio firewalld se está ejecutando en todas las máquinas cliente (lo cual puede verificar ejecutando systemctl start firewalld), debe agregar los servicios HTTP y HTTPS en la configuración del firewall para permitir que las solicitudes del balanceador de carga atraviesen el firewall. a los servidores web de Nginx. Luego vuelva a cargar el servicio firewalld para efectuar los nuevos cambios (haga esto en todas las máquinas cliente).

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. A continuación, abra un navegador web en sus máquinas locales y pruebe si la instalación de Nginx está funcionando bien. Utilice la IP del cliente para navegar, una vez que vea la página de prueba de Nginx, significa que el servidor web instalado en la máquina cliente está funcionando correctamente.

5. A continuación, necesitamos crear páginas de prueba en las máquinas cliente que usaremos más adelante para probar la configuración de HAProxy.

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

Paso 2: Instalar y configurar el servidor HAProxy en CentOS 8

6. Ahora instale el paquete HAProxy en el servidor HAProxy ejecutando el siguiente comando.

# dnf install haproxy

7. A continuación, inicie el servicio HAProxy, habilítelo para que se inicie automáticamente al arrancar el sistema y verifique su estado.

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy

8. Ahora configuraremos el HAProxy usando el siguiente archivo de configuración.

# vi /etc/haproxy/haproxy.cfg

El archivo de configuración se divide en cuatro secciones principales.

  • global settings – sets process-wide parameters.
  • defaults – this section sets default parameters for all other sections following its declaration.
  • frontend – this section describes a set of listening sockets accepting client connections.
  • Backend – this section describes a set of servers to which the proxy will connect to forward incoming connections.

Para comprender las opciones en la configuración global y los valores predeterminados, lea la documentación de HAProxy (enlace proporcionado al final del artículo). Para esta guía, usaremos los valores predeterminados.

9. HAProxy, una vez implementado, desempeñará un papel importante en su infraestructura de TI, por lo que configurar el registro es un requisito básico; esto le permite obtener información sobre cada conexión a sus servidores web backend.

El parámetro de registro (resaltado en la siguiente captura de pantalla) declara un servidor Syslog global (como rsyslog, el predeterminado en CentOS) que recibirá mensajes de registro. Aquí se puede declarar más de un servidor.

La configuración predeterminada apunta al host local (127.0.0.1) y local2 es el código de instalación predeterminado que se usa para identificar los mensajes de registro de HAProxy en rsyslog.

10. A continuación, debe indicarle al servidor rsyslog cómo recibir y procesar los mensajes de registro de HAProxy. Abra el archivo de configuración rsyslog en /etc/rsyslog.conf o cree un nuevo archivo dentro del directorio /etc/rsyslog.d, por ejemplo /etc/rsyslog.d/haproxy.conf.

# vi /etc/rsyslog.d/haproxy.conf

Copie y pegue la siguiente configuración para recopilar el registro con UDP en el puerto predeterminado 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

También agregue estas líneas para indicarle a rsyslog que escriba en dos archivos de registro separados según la gravedad, donde local2 es el código de instalación definido en la configuración de HAProxy anterior.

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11. Guarde el archivo y ciérrelo. Luego reinicie el servicio rsyslog para aplicar los cambios recientes.

# systemctl restart rsyslog

12. En esta sección, demostraremos cómo configurar los proxies de front-end y back-end. Vuelva al archivo de configuración de HAProxy y modifique las secciones predeterminadas de front-end y back-end de la siguiente manera. No entraremos en una explicación detallada de cada parámetro, siempre puede consultar la documentación oficial.

La siguiente configuración define una sección de escucha utilizada para servir la página de estadísticas de HAProxy. El parámetro de vinculación asigna un oyente a una dirección IP determinada ( * para todos en este caso) y puerto (9000).

La configuración de habilitación de estadísticas habilita la página de estadísticas a la que se accederá mediante el URI/stats (es decir, http:/server_ip: 9000/stats ).

La configuración de autenticación de estadísticas se usa para agregar una autenticación básica al acceder a la página (reemplace haproxy y [email protected] con un nombre de usuario y contraseña de su elección).

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:[email protected]

13. La siguiente configuración define una sección de frontend llamada TL (puede dar un nombre de su agrado). El parámetro de modo define el modo en el que opera HAProxy.

El parámetro acl (lista de control de acceso) se utiliza para tomar una decisión basada en el contenido extraído de la solicitud. En este ejemplo, la solicitud se considera HTTP simple si no se realiza a través de SSL.

Luego, la configuración de encabezado de conjunto de solicitud http se usa para agregar un encabezado HTTP a la solicitud. Esto ayuda a informar a Nginx que la solicitud inicial se realizó a través de HTTP (o mediante el puerto 80).

La directiva default_backend o use_backend define los servidores backend, en este caso, referenciados por TL_web_servers.

Tenga en cuenta que HAProxy devolverá un "error 503 de servicio no disponible" si una solicitud no es enrutada por una directiva use_backend o default_backend.

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14. Luego, necesitamos definir una sección de back-end donde la configuración de balance define cómo HAProxy selecciona los servidores de back-end para procesar una solicitud si ningún método de persistencia anula esa selección.

La directiva de cookies habilita la persistencia basada en cookies, le indica a HAProxy que envíe una cookie llamada SERVERID al cliente y la asocie con el ID del servidor que dio la respuesta inicial.

La directiva del servidor se utiliza para definir los servidores ascendentes en el formato nombre_servidor (por ejemplo, websrv1), IP_servidor: puerto y opciones.

Una opción clave es verificar que le dice a HAProxy que siga verificando la disponibilidad de un servidor e informe en la página de estadísticas.

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

Comente cualquier otra sección de frontend y backend como se muestra en la captura de pantalla que sigue. Guarde el archivo y ciérrelo.

15. Ahora reinicie el servicio HAProxy para aplicar los nuevos cambios.

# systemctl restart haproxy

16. A continuación, asegúrese de que los servicios HTTP (puerto 80) y HTTPS (puerto 433) estén abiertos en el firewall para aceptar las solicitudes de los clientes de la siguiente manera. Además, abra el puerto 9000 en el firewall para acceder a la página de estadísticas y vuelva a cargar la configuración del firewall.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

Paso 3: Prueba de la configuración de HAProxy y visualización de estadísticas

17. Ahora es el momento de probar la configuración de HAPrxoy. En la máquina de escritorio local desde donde accede a todos los servidores, agregue la siguiente línea en el archivo/etc/hosts para permitirnos usar el dominio del sitio ficticio.

10.42.0.247  www.tecmint.lan

18. A continuación, abra un navegador y navegue utilizando la dirección del servidor o el dominio del sitio.

http://10.42.0.247/
OR
http://www.tecmint.lan/

19. Para acceder a la página de estadísticas de HAProxy, use la siguiente dirección.

http://10.42.0.247:9000/stats

Luego use el nombre de usuario y la contraseña que definió en el archivo de configuración de HAProxy (consulte el parámetro de autenticación de estadísticas).

Después de un inicio de sesión exitoso, llegará a la página de estadísticas de HAProxy que le muestra métricas que cubren la salud de sus servidores, tasas de solicitudes actuales, tiempos de respuesta y mucho más.

Para demostrar cómo funciona el informe de estado con respecto a los códigos de color, hemos instalado uno de los servidores back-end.

Paso 4: Configuración de HTTPS en HAProxy mediante un certificado SSL autofirmado

20. En esta sección final, demostraremos cómo configurar SSL/TLS para asegurar todas las comunicaciones entre el servidor y el cliente HAProxy. HAProxy admite cuatro modos de configuración HTTPS principales, pero para esta guía, usaremos la descarga SSL/TLS.

En el modo de descarga SSL/TLS, HAProxy descifra el tráfico en el lado del cliente y se conecta en un tráfico claro a los servidores backend.

Comenzaremos creando el certificado y la clave como se muestra (responda las preguntas en consecuencia según los detalles de su empresa durante la creación del certificado, como se resalta en la captura de pantalla).

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l

21. A continuación, abra el archivo de configuración de HAProxy (/etc/haproxy/haproxy.cfg) y edite la sección de interfaz.

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers

Guarde el archivo y ciérrelo.

22. Luego reinicie el servicio HAProxy para aplicar los nuevos cambios.

# systemctl restart haproxy.service

23. A continuación, abra un navegador web e intente acceder al sitio una vez más. El navegador mostrará un error debido al certificado autofirmado, haga clic en Avanzado para continuar.

¡Eso es todo por ahora! Cada aplicación web tiene su propio conjunto de requisitos, necesita diseñar y configurar el equilibrio de carga para adaptarse a su infraestructura de TI y los requisitos de la aplicación.

Para obtener más información sobre algunas de las opciones de configuración utilizadas en esta guía y, en general, sobre cómo utilizar HAProxy, consulte la documentación oficial de la edición comunitaria de HAProxy o la documentación de la versión empresarial de HAProxy. Puede publicar cualquier pregunta o comentario a través del formulario de comentarios a continuación.