- Introduction
- Prérequis
- Etape 1 – Installation et activation de HAProxy
- Étape 2 – Configuration des directives de journalisation de HAProxy
- Etape 3 – Configuration de Rsyslog pour collecter les journaux HAProxy
- Étape 4 – (facultatif) Configuration de SELinux
- Etape 5 – Test de la journalisation HAProxy
- Conclusion
Introduction
HAProxy, qui signifie High Availability Proxy, est un serveur proxy basé sur TCP et HTTP largement utilisé qui fonctionne sur Linux, Solaris et FreeBSD. Il est utilisé pour équilibrer la charge des applications en distribuant les demandes entre plusieurs serveurs, et pour s’assurer que les applications sont hautement disponibles pour les utilisateurs.
Par défaut sur de nombreuses installations CentOS 8, HAProxy n’est pas configuré pour écrire sa sortie de journal dans un fichier. Ce tutoriel de démarrage rapide expliquera comment configurer la journalisation HAProxy avec Rsyslog en utilisant un socket de domaine Unix pour la fiabilité, la vitesse et la sécurité.
Prérequis
Pour compléter ce tutoriel, vous aurez besoin d’un serveur exécutant CentOS 8. Ce serveur doit avoir un utilisateur non-root avec des privilèges d’administration. Pour le configurer, suivez le guide de configuration initiale du serveur pour le tutoriel CentOS 8.
Etape 1 – Installation et activation de HAProxy
Pour installer HAProxy, exécutez la commande dnf
suivante :
- sudo dnf install haproxy
Lorsque vous êtes invité Is this ok :
à entrer y
et appuyez sur RETURN
pour installer le paquet.
Une fois que vous avez installé HAProxy, activez-le et démarrez-le en utilisant la commande systemctl
:
- sudo systemctl enable haproxy.service
Vous devriez recevoir la sortie suivante :
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Avec le service HAProxy maintenant activé, vous pouvez le démarrer pour vous assurer qu’il fonctionne avec une configuration par défaut sur votre serveur:
- sudo systemctl start haproxy.service
Examinez ensuite le statut de HAProxy pour vous assurer qu’il est en cours d’exécution:
- sudo systemctl status haproxy.service
Vous devriez recevoir une sortie comme la suivante. Notez la partie surlignée active (running)
de la sortie. Si votre serveur affiche la même section en surbrillance, alors HAProxy s’exécute correctement sur votre serveur et vous pouvez procéder à la configuration de la journalisation.
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 votre sortie est différente, ou si l’état affiche quelque chose comme Active: failed
, suivez les étapes de dépannage du tutoriel Comment dépanner les erreurs HAProxy courantes pour déterminer ce qui empêche HAProxy de démarrer correctement.
Une fois que vous avez confirmé que HAProxy est activé et fonctionne, vous pouvez passer à l’étape suivante, qui consiste à configurer les directives de journalisation de HAProxy.
Étape 2 – Configuration des directives de journalisation de HAProxy
Pour configurer les directives de journalisation de HAProxy, ouvrez /etc/haproxy/haproxy.cfg
dans vi
ou votre éditeur préféré :
- sudo vi /etc/haproxy/haproxy.cfg
Appuyez sur i
pour passer en mode INSERT
, puis trouvez la ligne log 127.0.0.1 local2
et commentez-la en ajoutant un caractère #
au début de la ligne, comme le souligne l’exemple suivant :
. . .# 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. . .
Ajouter maintenant une ligne directement après la ligne commentée avec le contenu suivant:
log /dev/log local0
La section entière de /etc/haproxy/haproxy.cfg
que vous avez éditée devrait contenir les lignes suivantes:
. . .# 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 ligne chroot
est importante, car elle restreint le processus HAProxy à l’accès aux fichiers du répertoire /var/lib/haproxy
uniquement. La ligne log /dev/log local0
créera un fichier à l’intérieur de ce répertoire que Rsyslog utilisera pour collecter les entrées de journal à partir de.
Une fois que vous avez fini de modifier les lignes log
dans /etc/haproxy/haproxy.cfg
, enregistrez et fermez le fichier en appuyant sur ESC
, en tapant :wq
et en appuyant sur ENTER
.
La dernière étape que vous devez effectuer dans cette section est de créer le répertoire /var/lib/haproxy/dev
puisqu’il n’existe pas par défaut.
Créez le répertoire en utilisant la commande mkdir
puis redémarrez HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Vous avez maintenant configuré HAProxy pour envoyer ses journaux à un socket de domaine Unix qui réside dans /var/lib/haproxy/dev/log
. Dans l’étape suivante, vous allez configurer Rsyslog pour créer et accéder au socket.
Etape 3 – Configuration de Rsyslog pour collecter les journaux HAProxy
La configuration par défaut de Rsyslog sur CentOS 8 ne gère pas les journaux HAProxy. Pour collecter les journaux du service HAProxy, ouvrez un nouveau fichier /etc/rsyslog.d/99-haproxy.conf
en utilisant vi
ou votre éditeur préféré :
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Appuyez sur i
pour passer en mode INSERT
, puis collez les lignes suivantes dans le fichier :
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
La directive $AddUnixListenSocket
indique à Rsyslog de créer une socket de domaine Unix à l’emplacement spécifié, dans ce cas /var/lib/haproxy/dev/log
. La section :programname, startswith, "haproxy"
spécifie le fichier dans lequel Rsyslog écrira les entrées de journal qu’il collecte à partir du socket.
Une fois que vous avez fini de modifier /etc/rsyslog.d/99-haproxy.conf
, enregistrez et fermez le fichier en appuyant sur ESC
, en tapant :wq
et en appuyant sur ENTER
.
Vous avez maintenant configuré Rsyslog pour lire les entrées de journal à partir du socket de domaine Unix dans /var/lib/haproxy/dev/log
et les écrire dans un fichier de journal dans /var/log/haproxy.log
.
Cependant, avant de redémarrer Rsyslog, vous devrez déterminer si SELinux applique le contrôle d’accès sur votre système CentOS 8.
Pour vérifier la politique actuelle de SELinux, exécutez ce qui suit :
- getenforce
Vous recevrez l’une des sorties suivantes :
-
Enforcing
– Dans ce mode, SELinux applique les contrôles d’accès sur votre système. Vous devrez compléter la section facultative suivante Étape 4 – Configuration de SELinux. -
Permissive
– Dans ce cas, SELinux consigne toutes les tentatives d’accès dans son fichier journal, mais n’applique pas de contrôles d’accès sur votre système. -
Disabled
– Si SELinux est désactivé, alors il ne consigne ni n’applique aucune politique de contrôle d’accès sur votre système.
Si la commande getenforce
a renvoyé soit Permissive
soit Disabled
, alors vous pouvez redémarrer Rsyslog avec la commande suivante :
- sudo systemctl restart rsyslog
Une fois que vous aurez redémarré Rsyslog, vous pourrez visualiser les journaux dans le fichier /var/log/haproxy.log
que vous avez configuré dans /etc/rsyslog.d/99-haproxy.conf
. Passez à l’étape 5 – Test de la journalisation HAProxy pour vous assurer que tout fonctionne comme prévu.
Au contraire, si votre système exécute SELinux en mode Enforcing
, alors la section suivante de ce tutoriel explique comment ajouter un module pour permettre à Rsyslog et HAProxy de communiquer entre eux sur leur socket de domaine Unix partagé.
Étape 4 – (facultatif) Configuration de SELinux
Si votre système CentOS 8 est configuré avec SELinux en mode Enforcing
, alors vous devrez autoriser Rsyslog à accéder au répertoire chroot
de HAProxy. Autoriser cet accès permettra à Rsyslog de créer le socket de domaine Unix vers lequel HAproxy enverra ses journaux.
Si vous n’êtes pas familier avec SELinux, cette série de tutoriels Une introduction à SELinux sur CentOS 7 vous aidera à apprendre à gérer et à interagir avec SELinux. Bien qu’elle soit écrite pour CentOS 7, les principes et les commandes de la série sont également applicables à CentOS 8.
Pour permettre à Rsyslog et HAProxy d’accéder à leur socket partagé, la première tâche consiste à créer un fichier de politique d’application de type. Ouvrez un nouveau fichier appelé rsyslog-haproxy.te
dans vi
ou votre éditeur préféré:
- vi rsyslog-haproxy.te
Passez i
pour passer en mode INSERT
, puis collez les lignes suivantes dans le fichier:
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 première ligne définit le nom et la version du module. La partie require
indique au chargeur de modules SELinux les types et les classes nécessaires pour que la politique soit chargée en tant que module. Les deux dernières lignes sont les règles qui permettent à Rsyslog d’accéder respectivement au fichier chroot
et au fichier socket de HAProxy.
Lorsque vous avez fini de modifier le fichier, enregistrez-le et fermez-le en appuyant sur ESC
, en tapant :wq
et en appuyant sur ENTER
.
Puis, exécutez la commande suivante pour installer le paquet checkpolicy
, qui contient l’utilitaire checkmodule
que vous utiliserez pour transformer le fichier Type Enforcement en un module SELinux.
- sudo dnf install checkpolicy
Maintenant que vous avez installé l’outil checkmodule
, l’étape suivante consiste à compiler le module puis à le charger dans SELinux. Exécutez ce qui suit pour compiler le fichier Type Enforcement dans un module SELinux :
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Puis, exécutez semodule_package
pour générer un paquet de politique complet que SELinux peut charger dans le noyau Linux :
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
L’étape finale consiste à charger le paquet que vous avez généré dans le noyau Linux en utilisant la commande semodule
:
- sudo semodule -i rsyslog-haproxy.pp
L’ajout du module peut prendre quelques secondes. Une fois la commande terminée, vous pouvez confirmer que le module est chargé dans le noyau en exécutant la commande semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Vous devriez recevoir une sortie comme la suivante:
Outputrsyslog-haproxy
Une fois le module chargé, vous pouvez redémarrer Rsyslog avec la commande suivante:
- sudo systemctl restart rsyslog
Vous avez maintenant défini, compilé et chargé une politique SELinux qui permettra à HAProxy et Rsyslog de communiquer sur leur socket partagé.
Dans l’étape suivante, vous allez tester que tout fonctionne en faisant une requête HTTP à HAProxy et en examinant son nouveau fichier journal.
Etape 5 – Test de la journalisation HAProxy
Maintenant que vous avez configuré HAProxy, Rsyslog, et optionnellement SELinux, vous pouvez tester que la journalisation vers /var/log/haproxy.log
fonctionne.
Par défaut, le paquet haproxy
est livré avec un fichier de configuration qui crée un socket écouteur HTTP sur le port 5000. La configuration pointe vers un serveur backend inexistant, de sorte que toute requête vers le port se traduira par une erreur HTTP 503.
Pour vérifier la présence d’une erreur 503 dans votre fichier /var/log/haproxy.log
, générez d’abord une requête HTTP en utilisant curl
comme ceci :
- curl -si http://127.0.0.1:5000
Vous devriez recevoir une sortie comme la suivante :
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>
Examinez maintenant /var/log/haproxy.log
pour toute réponse HTTP 503 en utilisant la commande grep
:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Note : La partie NOSRV.+503
de la commande est une expression régulière. Ce tutoriel sur l’utilisation de Grep &Expressions régulières pour rechercher des motifs de texte dans Linux
va plus en profondeur sur l’utilisation de grep
et des expressions régulières.
Vous devriez recevoir une ligne (ou plusieurs lignes) comme la suivante :
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"
Cette ligne correspond à la requête curl
que vous avez faite, ce qui signifie que Rsyslog et HAProxy sont configurés pour utiliser correctement leur socket partagé.
Conclusion
Dans ce tutoriel de démarrage rapide, vous avez configuré HAProxy pour se connecter à un socket de domaine Unix. Vous avez également configuré Rsyslog pour créer et lire à partir du socket afin que les deux programmes puissent communiquer entre eux sans ouvrir de ports TCP/IP sur votre système. Enfin, vous avez facultativement compilé, empaqueté et chargé une politique SELinux pour permettre à Rsyslog et HAProxy un accès partagé à leur socket.