Búsqueda de sitios web

Cómo configurar HAProxy como equilibrador de carga 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 grupo de servidores en los que todos ejecuten las mismas aplicaciones y luego implementar equilibradores de carga delante de ellos para distribuir el tráfico.

HAProxy es un equilibrador de carga, servidor proxy y terminador SSL/TLS de alta disponibilidad TCP/HTTP de código abierto, potente, de alto rendimiento, confiable, seguro y ampliamente utilizado diseñado para Sitios web de muy alto tráfico. Funciona bien y de forma fiable en Linux, Solaris, FreeBSD, OpenBSD así como en los sistemas operativos AIX.

Esta guía muestra cómo configurar un equilibrador de carga dedicado de alta disponibilidad 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.

Requisitos previos:

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

Configuración del entorno de prueba

----------- 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: configurar el servidor HTTP Nginx en las máquinas cliente

1. Inicie sesión en todas sus máquinas cliente CentOS 8 e instale el servidor web Nginx utilizando 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 iniciar el sistema y confirme que esté en funcionamiento comprobando su estado mediante systemctl. comandos (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 el HTTP y el Servicios HTTPS en la configuración del firewall para permitir que las solicitudes del balanceador de carga pasen a través del firewall a los servidores web 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, debemos 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 iniciar el sistema y verifique su estado.

systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy

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

vi /etc/haproxy/haproxy.cfg

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

  • configuración global: establece parámetros para todo el proceso.
  • defaults: esta sección establece parámetros predeterminados para todas las demás secciones después de su declaración.
  • frontend: esta sección describe un conjunto de sockets de escucha que aceptan conexiones de clientes.
  • Backend: esta sección describe un conjunto de servidores a los que se conectará el proxy para reenviar las conexiones entrantes.

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

Configurar el registro de HAProxy

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 log (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 localhost (127.0.0.1) y local2 es el código de instalación predeterminado utilizado 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 HAProxy. Abra el archivo de configuración de 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 registros con UDP en el puerto predeterminado 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Agregue también 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

Configuración del front-end y back-end de HAProxy

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

La siguiente configuración define una sección escuchar que se utiliza para mostrar la página Estadísticas de HAProxy. El parámetro bind asigna un oyente a una dirección IP determinada (* para todos en este caso) y un puerto (9000 ). ).

La configuración enable 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 auth de estadísticas se utiliza para agregar una autenticación básica al acceder a la página (reemplace haproxy y Lostp@1ss 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:Lostp@1ss

13. La siguiente configuración define una sección de frontend llamada TL (puedes ponerle el nombre que prefieras). El parámetro mode 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 http-request set-header se utiliza 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 a través del puerto 80).

La directiva default_backend o use_backend define los servidores backend, en este caso, a los que hace referencia TL_web_servers.

Tenga en cuenta que HAProxy devolverá un “Error 503 Servicio no disponible” si una solicitud no es enrutada por un use_backend o un default_backend . directiva.

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, debemos definir una sección de backend donde la configuración de equilibrio define cómo HAProxy selecciona los servidores de back-end para procesar una solicitud si no El método de persistencia anula esa selección.

La directiva cookie permite la persistencia basada en cookies, indica a HAProxy que envíe una cookie denominada SERVERID al cliente y para asociarlo con el ID del servidor que dio la respuesta inicial.

La directiva server se utiliza para definir los servidores ascendentes en el formato sever_name (por ejemplo, websrv1), server_IP:port. y opciones.

Una opción clave es verificar, que le indica 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 siguiente. 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 el HTTP (puerto 80) y el HTTPS (puerto 433) los servicios se abren en el firewall para aceptar solicitudes de 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: Probar la configuración de HAProxy y ver las 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. Luego 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, utilice 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 iniciar sesión correctamente, accederá a la página de estadísticas de HAProxy que le muestra métricas que cubren el estado de sus servidores, las tasas de solicitudes actuales, los 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: Configurar HTTPS en HAProxy usando un certificado SSL autofirmado

20. En esta sección final, demostraremos cómo configurar SSL/TLS para proteger todas las comunicaciones entre el servidor HAProxy y el cliente. HAProxy admite cuatro modos principales de configuración HTTPS, 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 con 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 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; es necesario diseñar y configurar el equilibrio de carga para que se adapte a su infraestructura de TI y a 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 idea a través del formulario de comentarios a continuación.