Introducción
HAProxy, que significa High Availability Proxy, es un servidor proxy basado en TCP y HTTP ampliamente utilizado que se ejecuta en Linux, Solaris y FreeBSD. Se utiliza para equilibrar la carga de las aplicaciones distribuyendo las peticiones entre varios servidores, y para asegurar que las aplicaciones estén altamente disponibles para los usuarios.
Por defecto en muchas instalaciones de CentOS 8, HAProxy no está configurado para escribir su salida de registro en un archivo. Este tutorial de inicio rápido explicará cómo configurar el registro de HAProxy con Rsyslog utilizando un socket de dominio Unix para mayor fiabilidad, velocidad y seguridad.
Requisitos previos
Para completar este tutorial, necesitará un servidor que ejecute CentOS 8. Este servidor debe tener un usuario no root con privilegios administrativos. Para configurarlo, siga la guía de configuración inicial del servidor para el tutorial de CentOS 8.
Paso 1 – Instalar y habilitar HAProxy
Para instalar HAProxy, ejecute el siguiente comando dnf
:
- sudo dnf install haproxy
Cuando se le solicite Is this ok :
introduzca y
y pulse RETURN
para instalar el paquete.
Una vez que haya instalado HAProxy, habilítelo e inícielo utilizando el comando systemctl
:
- sudo systemctl enable haproxy.service
Debería recibir la siguiente salida:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Con el servicio HAProxy ahora habilitado, puede iniciarlo para asegurarse de que se ejecuta con una configuración predeterminada en su servidor:
- sudo systemctl start haproxy.service
A continuación, examine el estado de HAProxy para asegurarse de que se está ejecutando:
- sudo systemctl status haproxy.service
Debería recibir una salida como la siguiente. Observe la parte resaltada active (running)
de la salida. Si su servidor muestra la misma sección resaltada, entonces HAProxy se está ejecutando correctamente en su servidor y puede proceder a configurar el registro.
Output● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS) Main PID: 21341 (haproxy) Tasks: 2 (limit: 2881) Memory: 2.7M CGroup: /system.slice/haproxy.service ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid. . .
Si su salida es diferente, o el estado muestra algo como Active: failed
, entonces siga los pasos de solución de problemas en el tutorial Cómo solucionar errores comunes de HAProxy para determinar qué está impidiendo que HAProxy se inicie correctamente.
Una vez que haya confirmado que HAProxy está habilitado y funcionando, puede continuar con el siguiente paso, que es configurar las directivas de registro de HAProxy.
Paso 2 – Configurar las directivas de registro de HAProxy
Para configurar las directivas de registro de HAProxy, abra /etc/haproxy/haproxy.cfg
en vi
o su editor preferido:
- sudo vi /etc/haproxy/haproxy.cfg
Pulse i
para cambiar al modo INSERT
, luego busque la línea log 127.0.0.1 local2
y coméntela añadiendo un carácter #
al principio de la línea, como se destaca en el siguiente ejemplo:
. . .# 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. . .
Ahora añada una línea directamente después de la línea comentada con el siguiente contenido:
log /dev/log local0
La sección completa de /etc/haproxy/haproxy.cfg
que editó debe contener las siguientes líneas:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
La línea chroot
es importante, porque restringe el proceso HAProxy para acceder a los archivos en el directorio /var/lib/haproxy
solamente. La línea log /dev/log local0
creará un archivo dentro de ese directorio que Rsyslog utilizará para recoger las entradas del registro.
Una vez que haya terminado de editar las líneas log
en /etc/haproxy/haproxy.cfg
, guarde y cierre el archivo pulsando ESC
, escribiendo :wq
y pulsando ENTER
.
El último paso que debe completar en esta sección es crear el directorio /var/lib/haproxy/dev
ya que no existe por defecto.
Cree el directorio utilizando el comando mkdir
y luego reinicie HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Ahora ha configurado HAProxy para enviar sus registros a un socket de dominio Unix que reside en /var/lib/haproxy/dev/log
. En el siguiente paso, configurará Rsyslog para crear y acceder al socket.
Paso 3 – Configurar Rsyslog para recoger los registros de HAProxy
La configuración por defecto de Rsyslog en CentOS 8 no maneja los registros de HAProxy. Para recoger los registros del servicio HAProxy, abra un nuevo archivo /etc/rsyslog.d/99-haproxy.conf
utilizando vi
o su editor preferido:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Pulse i
para cambiar al modo INSERT
, luego pegue las siguientes líneas en el archivo:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
La directiva $AddUnixListenSocket
indica a Rsyslog que cree un socket de dominio Unix en la ubicación especificada, en este caso /var/lib/haproxy/dev/log
. La sección :programname, startswith, "haproxy"
especifica el archivo donde Rsyslog escribirá las entradas de registro que recoge del socket.
Una vez que haya terminado de editar /etc/rsyslog.d/99-haproxy.conf
, guarde y cierre el archivo pulsando ESC
, escribiendo :wq
y pulsando ENTER
.
Ahora ha configurado Rsyslog para leer las entradas de registro del socket de dominio Unix en /var/lib/haproxy/dev/log
y escribirlas en un archivo de registro en /var/log/haproxy.log
.
Sin embargo, antes de reiniciar Rsyslog tendrá que determinar si SELinux está aplicando el control de acceso en su sistema CentOS 8.
Para comprobar la política actual de SELinux, ejecute lo siguiente:
- getenforce
Recibirá una de las siguientes salidas:
-
Enforcing
– En este modo, SELinux está aplicando los controles de acceso en su sistema. En este caso, SELinux registra todos los intentos de acceso en su archivo de registro, pero no aplica los controles de acceso en su sistema. -
Disabled
– Si SELinux está desactivado, no registra ni aplica ninguna política de control de acceso en su sistema.
Si el comando getenforce
devolvió Permissive
o Disabled
, entonces puede reiniciar Rsyslog con el siguiente comando:
- sudo systemctl restart rsyslog
Una vez que reinicie Rsyslog, podrá ver los registros en el archivo /var/log/haproxy.log
que configuró en /etc/rsyslog.d/99-haproxy.conf
. Continúe con el Paso 5 – Probando el registro de HAProxy para asegurarse de que todo funciona como se espera.
De lo contrario, si su sistema está ejecutando SELinux en modo Enforcing
, entonces la siguiente sección de este tutorial explica cómo agregar un módulo para permitir que Rsyslog y HAProxy se comuniquen entre sí a través de su socket de dominio Unix compartido.
Paso 4 – (Opcional) Configurar SELinux
Si su sistema CentOS 8 está configurado con SELinux en modo Enforcing
, entonces tendrá que permitir el acceso de Rsyslog al directorio chroot
de HAProxy. Permitir este acceso permitirá a Rsyslog crear el socket de dominio Unix al que HAproxy enviará sus registros.
Si no está familiarizado con SELinux, esta serie de tutoriales Una introducción a SELinux en CentOS 7 le ayudará a aprender a gestionar e interactuar con SELinux. Aunque está escrito para CentOS 7, los principios y comandos de la serie son igualmente aplicables a CentOS 8.
Para habilitar el acceso de Rsyslog y HAProxy a su socket compartido, la primera tarea es crear un archivo de política Type Enforcement. Abra un nuevo archivo llamado rsyslog-haproxy.te
en vi
o su editor preferido:
- vi rsyslog-haproxy.te
Pulse i
para cambiar al modo INSERT
, luego pegue las siguientes líneas en el archivo:
module rsyslog-haproxy 1.0;require { type syslogd_t; type haproxy_var_lib_t; class dir { add_name remove_name search write }; class sock_file { create setattr unlink };}#============= syslogd_t ==============allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };
La primera línea define el nombre y la versión del módulo. La parte require
indica al cargador de módulos de SELinux los tipos y clases que se requieren para que la política se cargue como módulo. Las dos últimas líneas son las reglas que permiten el acceso de Rsyslog al archivo chroot
y al socket de HAProxy respectivamente.
Cuando termine de editar el archivo, guárdelo y ciérrelo presionando ESC
, escribiendo :wq
y presionando ENTER
.
A continuación, ejecute el siguiente comando para instalar el paquete checkpolicy
, que contiene la utilidad checkmodule
que utilizará para convertir el archivo Type Enforcement en un módulo de SELinux.
- sudo dnf install checkpolicy
Ahora que tiene la herramienta checkmodule
instalada, el siguiente paso es compilar el módulo y luego cargarlo en SELinux. Ejecute lo siguiente para compilar el archivo Type Enforcement en un módulo de SELinux:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Luego, ejecute semodule_package
para generar un paquete de políticas completo que SELinux pueda cargar en el kernel de Linux:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
El paso final es cargar el paquete que generó en el kernel de Linux usando el comando semodule
:
- sudo semodule -i rsyslog-haproxy.pp
Añadir el módulo puede tomar unos segundos. Una vez que el comando se complete puedes confirmar que el módulo está cargado en el kernel ejecutando el comando semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Deberías recibir una salida como la siguiente:
Outputrsyslog-haproxy
Una vez que el módulo está cargado puedes reiniciar Rsyslog con el siguiente comando:
- sudo systemctl restart rsyslog
Ahora has definido, compilado y cargado una política SELinux que permitirá a HAProxy y Rsyslog comunicarse a través de su socket compartido.
En el siguiente paso probarás que todo funciona haciendo una petición HTTP a HAProxy y examinando su nuevo fichero de registro.
Paso 5 – Probar el registro de HAProxy
Ahora que ha configurado HAProxy, Rsyslog y, opcionalmente, SELinux, puede probar que el registro en /var/log/haproxy.log
funciona.
Por defecto, el paquete haproxy
viene con un archivo de configuración que crea un socket de escucha HTTP en el puerto 5000. La configuración apunta a un servidor backend inexistente, por lo que cualquier solicitud al puerto resultará en un error HTTP 503.
Para comprobar si hay un error 503 en su archivo /var/log/haproxy.log
, primero genere una petición HTTP usando curl
como esta:
- curl -si http://127.0.0.1:5000
Debería recibir una salida como la siguiente:
OutputHTTP/1.0 503 Service UnavailableCache-Control: no-cacheConnection: closeContent-Type: text/html<html><body><h1>503 Service Unavailable</h1>No server is available to handle this request.</body></html>
Ahora examine /var/log/haproxy.log
para cualquier respuesta HTTP 503 usando el comando grep
:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Nota: La parte NOSRV.+503
del comando es una expresión regular. Este tutorial sobre el uso de Grep & Expresiones regulares para buscar patrones de texto en Linux
profundiza en el uso de grep
y expresiones regulares.
Debería recibir una línea (o varias líneas) como la siguiente:
OutputSep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy: 127.0.0.1:56024 main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Esta línea corresponde a la solicitud curl
que hizo, lo que significa que Rsyslog y HAProxy están configurados para utilizar su socket compartido correctamente.
Conclusión
En este tutorial de inicio rápido, configuró HAProxy para registrar en un socket de dominio Unix. También ha configurado Rsyslog para crear y leer desde el socket para que los dos programas puedan comunicarse entre sí sin abrir ningún puerto TCP/IP en su sistema. Finalmente, opcionalmente compiló, empaquetó y cargó una política SELinux para permitir a Rsyslog y HAProxy el acceso compartido a su socket.