Cómo configurar el registro de HAProxy con Rsyslog en Rocky Linux 8 [Inicio rápido]

Introducción
HAProxy, que significa High Availability Proxy, es un servidor proxy basado en TCP y HTTP muy utilizado que se ejecuta en Linux, Solaris y FreeBSD. Se utiliza para equilibrar la carga de las aplicaciones distribuyendo las solicitudes entre varios servidores y para garantizar que las aplicaciones estén altamente disponibles para los usuarios.
De manera predeterminada, en muchas instalaciones de Rocky Linux 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 mediante un socket de dominio Unix para lograr confiabilidad, velocidad y seguridad.
Prerrequisitos
Para completar este tutorial, necesitará un servidor que ejecute Rocky Linux 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 Rocky Linux 8.
Paso 1: Instalación y habilitación de HAProxy
Para instalar HAProxy, ejecute el siguiente dnf
comando:
- sudo dnf install haproxy
Cuando se le solicite, Is this ok [y/N]:
ingrese y
y presione RETURN
para instalar el paquete.
Una vez que haya instalado HAProxy, habilítelo e inícielo usando el systemctl
comando:
- sudo systemctl enable haproxy.service
Debería recibir el siguiente resultado:
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 ejecute 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 un resultado como el siguiente. Observe la active (running)
parte resaltada del resultado. Si su servidor muestra la misma sección resaltada, entonces HAProxy se está ejecutando correctamente en su servidor y puede continuar con la configuración del 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 el resultado es diferente o el estado muestra algo como Active: failed
, siga los pasos de solución de problemas del tutorial Cómo solucionar errores comunes de HAProxy para determinar qué impide que HAProxy se inicie correctamente.
Una vez que haya confirmado que HAProxy está habilitado y en ejecución, puede continuar con el siguiente paso, que es configurar las directivas de registro de HAProxy.
Paso 2: Configuración de directivas de registro de HAProxy
Para configurar las directivas de registro de HAProxy, abra /etc/haproxy/haproxy.cfg
en vi
su editor preferido:
- sudo vi /etc/haproxy/haproxy.cfg
Presione i
para cambiar al INSERT
modo, luego busque la línea log 127.0.0.1 local2
y coméntela agregando un #
carácter al comienzo de la línea, como se resalta en el siguiente ejemplo:
/etc/haproxy/haproxy.cfg
. . .# 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 agregue una línea directamente después de la línea comentada con el siguiente contenido:
log /dev/log local0
La sección completa /etc/haproxy/haproxy.cfg
que editaste debe contener las siguientes líneas:
/etc/haproxy/haproxy.cfg
. . .# 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 chroot
línea es importante porque restringe el proceso HAProxy al acceso a los archivos del /var/lib/haproxy
directorio únicamente. La log /dev/log local0
línea creará un archivo dentro de ese directorio que Rsyslog utilizará para recopilar las entradas del registro.
Una vez que haya terminado de editar las log
líneas en /etc/haproxy/haproxy.cfg
, guarde y cierre el archivo presionando ESC
, escribiendo :wq
y presionando ENTER
.
El último paso que debes completar en esta sección es crear el /var/lib/haproxy/dev
directorio ya que no existe por defecto.
Cree el directorio usando el mkdir
comando y luego reinicie HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Ya 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: Configuración de Rsyslog para recopilar registros de HAProxy
La configuración predeterminada de Rsyslog en Rocky Linux 8 no maneja los registros de HAProxy. Para recopilar registros del servicio HAProxy, abra un nuevo archivo /etc/rsyslog.d/99-haproxy.conf
con vi
su editor preferido:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Presione i
para cambiar al INSERT
modo, luego pegue las siguientes líneas en el archivo:
/etc/rsyslog.d/99-haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
La $AddUnixListenSocket
directiva le indica a Rsyslog que cree un socket de dominio Unix en la ubicación especificada, en este caso /var/lib/haproxy/dev/log
. La :programname, startswith, "haproxy"
sección especifica el archivo en el que Rsyslog escribirá las entradas de registro que recopile del socket.
Una vez que haya terminado de editar /etc/rsyslog.d/99-haproxy.conf
, guarde y cierre el archivo presionando ESC
, escribiendo :wq
y presionando ENTER
.
Ahora ha configurado Rsyslog para leer las entradas de registro del socket de dominio Unix /var/lib/haproxy/dev/log
y escribirlas en un archivo de registro en /var/log/haproxy.log
.
Sin embargo, antes de reiniciar Rsyslog deberá determinar si SELinux está aplicando el control de acceso en su sistema Rocky Linux 8.
Para comprobar la política actual de SELinux, ejecute lo siguiente:
- getenforce
Recibirá uno de los siguientes resultados:
Enforcing
– En este modo, SELinux aplica controles de acceso en su sistema. Deberá completar la siguiente sección opcional Paso 4: Configuración de SELinux .Permissive
– En este caso, SELinux registra todos los intentos de acceso en su archivo de registro, pero no aplica controles de acceso en su sistema.Disabled
– Si SELinux está deshabilitado, no registrará ni aplicará ninguna política de control de acceso en su sistema.
Si el getenforce
comando devolvió Permissive
o Disabled
, puede reiniciar Rsyslog con el siguiente comando:
- sudo systemctl restart rsyslog
Una vez que reinicie Rsyslog, podrá ver los registros en el /var/log/haproxy.log
archivo que configuró en /etc/rsyslog.d/99-haproxy.conf
. Continúe con el Paso 5: Prueba del registro de HAProxy para asegurarse de que todo funcione como se espera.
De lo contrario, si su sistema está ejecutando SELinux en Enforcing
modo , 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) Configuración de SELinux
Si su sistema Rocky Linux 8 está configurado con SELinux en Enforcing
modo , entonces deberá permitir que Rsyslog acceda al chroot
directorio de HAProxy. Permitir este acceso permitirá que Rsyslog cree el socket de dominio Unix al que HAproxy enviará sus registros.
Si no está familiarizado con SELinux, esta serie de tutoriales Introducción a SELinux en CentOS 7 le ayudará a aprender a administrar e interactuar con SELinux. Aunque está escrita para CentOS 7, los principios y comandos de la serie son igualmente aplicables a Rocky Linux 8.
Para habilitar el acceso de Rsyslog y HAProxy a su socket compartido, la primera tarea es crear un archivo de política de cumplimiento de tipos. Abra un nuevo archivo llamado rsyslog-haproxy.te
en vi
o en su editor preferido:
- vi rsyslog-haproxy.te
Presione i
para cambiar al INSERT
modo, luego pegue las siguientes líneas en el archivo:
rsyslog-haproxy.te
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. Esta require
parte le 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 que Rsyslog acceda a los archivos de HAProxy chroot
y socket respectivamente.
Cuando haya terminado 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 checkpolicy
paquete, que contiene la checkmodule
utilidad que utilizará para convertir el archivo Type Enforcement en un módulo SELinux.
- sudo dnf install checkpolicy
Ahora que tiene la checkmodule
herramienta 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 SELinux:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
A continuación, 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 generaste en el kernel de Linux usando el semodule
comando:
- sudo semodule -i rsyslog-haproxy.pp
La adición del módulo puede tardar unos segundos. Una vez que se complete el comando, puede confirmar que el módulo se cargó en el núcleo ejecutando el semodule
comando:
- sudo semodule -l |grep rsyslog-haproxy
Debería recibir un resultado como el siguiente:
Outputrsyslog-haproxy
Una vez cargado el módulo puedes reiniciar Rsyslog con el siguiente comando:
- sudo systemctl restart rsyslog
Ahora ha definido, compilado y cargado una política SELinux que permitirá que HAProxy y Rsyslog se comuniquen a través de su socket compartido.
En el siguiente paso, probará que todo funciona realizando una solicitud HTTP a HAProxy y examinando su nuevo archivo de registro.
Paso 5: Prueba del registro de HAProxy
Ahora que ha configurado HAProxy, Rsyslog y, opcionalmente, SELinux, puede probar que el registro /var/log/haproxy.log
funcione.
De forma predeterminada, el haproxy
paquete se entrega con un archivo de configuración que crea un socket de escucha HTTP en el puerto 5000. La configuración apunta a un servidor back-end inexistente, por lo que cualquier solicitud al puerto generará un error HTTP 503.
Para comprobar si hay un error 503 en su /var/log/haproxy.log
archivo, primero genere una solicitud HTTP de curl
la siguiente manera:
- curl -si http://127.0.0.1:5000
Debería recibir un resultado como el siguiente:
OutputHTTP/1.0 503 Service UnavailableCache-Control: no-cacheConnection: closeContent-Type: text/htmlhtmlbodyh1503 Service Unavailable/h1No server is available to handle this request./body/html
Ahora busque /var/log/haproxy.log
respuestas HTTP 503 utilizando el grep
comando:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Nota : La NOSRV.+503
parte del comando es una expresión regular. Este tutorial sobre el uso de Grep y expresiones regulares para buscar patrones de texto en Linux profundiza en el uso grep
de expresiones regulares.
Debería recibir una línea (o varias líneas) como la siguiente:
OutputSep 9 21:32:22 rocky-s-1vcpu-1gb-nyc3-01 haproxy[4451]: 127.0.0.1:56024 [9/Sep/2020:21:32:22.098] 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 curl
solicitud que usted realizó, lo que significa que Rsyslog y HAProxy están configurados para usar correctamente su socket compartido.
Conclusión
En este tutorial de inicio rápido, configuró HAProxy para iniciar sesión en un socket de dominio Unix. También configuró Rsyslog para crear y leer desde el socket de modo que los dos programas puedan comunicarse entre sí sin abrir ningún puerto TCP/IP en su sistema. Por último, compiló, empaquetó y cargó opcionalmente una política SELinux para permitir que Rsyslog y HAProxy compartan acceso a su socket.
Deja una respuesta