Plusieurs choses peuvent se produire lorsqu’un utilisateur atterrit sur un site web. Il y a même des moments où les demandes des utilisateurs n’atteignent pas un serveur, vous donnant potentiellement un faux positif disant que tout est OK. Il est loin le temps où un site web n’utilisait qu’un seul serveur. Dans le monde distribué d’aujourd’hui, il y a de nombreux serveurs derrière un équilibreur de charge qui distribue la charge des utilisateurs du site Web.
Alors, comment pouvez-vous savoir si tout se passe bien entre vos utilisateurs et vos serveurs ? Les journaux émis par les équilibreurs de charge et les serveurs proxy comme HAProxy vous donnent une perspective différente. Ils peuvent vous dire, par exemple, combien de temps prennent les demandes des utilisateurs et combien de demandes échouent. Ces informations sont précieuses et peuvent vous donner plus d’indices lorsque vous dépannez des incidents dans un environnement réel.
Dans le post d’aujourd’hui, je vous donnerai une brève explication du fonctionnement de la journalisation dans HAProxy, de la configuration de la journalisation, du traitement des journaux et de la façon d’éviter de manquer de stockage dans vos serveurs en raison de la taille importante des fichiers journaux.
Comment fonctionne la journalisation dans HAProxy?
Lorsque vous installez HAProxy, vous pouvez configurer la façon dont vous voulez travailler avec les journaux que cet outil enregistre. Par exemple, vous pouvez configurer HAProxy pour envoyer les journaux à différents endroits en même temps. Peut-être qu’une équipe a besoin d’obtenir les journaux en temps réel et qu’une autre peut utiliser les journaux pour identifier une tendance historique. Alternativement, vous pourriez simplement vouloir migrer les journaux vers un emplacement différent comme une solution de stockage de journalisation centralisée.
Typiquement, lorsque vous configurez la journalisation pour un outil, vous voulez que les journaux soient enregistrés sur un disque local. Cependant, dans un scénario où il va y avoir de nombreuses opérations d’écriture de journaux, cela peut être contre-productif. Les performances pourraient être dégradées et vous pourriez manquer certains journaux. Par défaut, HAProxy est livré avec une configuration permettant d’écrire les journaux sur un socket car c’est plus rapide que d’envoyer les journaux sur le réseau ou d’écrire directement dans un fichier.
Dans la documentation de HAProxy, il y a une section couvrant la journalisation de manière plus détaillée. Une fois que vous avez les bases de ce post, vous pouvez rapidement plonger plus profondément dans d’autres sujets comme la façon de capturer les cookies ou les en-têtes HTTP. Vous pouvez même configurer le type ou la verbosité des journaux que vous souhaitez voir.
Si vous ne l’avez pas encore fait, installez HAProxy. Dans Ubuntu, vous pouvez le faire de cette façon :
$ sudo apt-get install haproxy$ haproxy -vHA-Proxy version 1.8.8-1ubuntu0.11 2020/06/22Copyright 2000-2018 Willy Tarreau <[email protected]>
Configuration de la journalisation pour Syslog
Par défaut, il y a deux sections dans le fichier de configuration de HAProxy : global et defaults. Dans la section globale, vous configurez les fonctionnalités de bas niveau comme la sécurité, les performances et les destinations de journalisation. La section defaults est l’endroit où vous avez des paramètres qui s’appliquent à toutes les autres sections proxy ci-dessous, comme le front-end et le back-end. L’objectif est d’éviter les répétitions. Un post sur le site de HAProxy fournit plus de détails sur chaque section, mais pour notre cas, les sections global et defaults sont suffisantes.
Dans le fichier de configuration par défaut (/etc/haproxy/haproxy.cfg), vous avez quelque chose comme ceci pour la journalisation:
global log /dev/log local0 log /dev/log local1 notice # ... other properties not included heredefaults log global # ... other properties not included here
Lorsque vous regardez le répertoire « /dev/log/ », vous verrez un lien symbolique vers le journal de systemd, ce qui signifie que les journaux sont envoyés à syslog:
$ ls -la /dev/loglrwxrwxrwx 1 root root 28 Aug 21 22:37 /dev/log -> /run/systemd/journal/dev-log
Les versions récentes comme Ubuntu 18.04 sont livrées avec rsyslog installé. Sinon, vous devrez l’installer en exécutant la commande « sudo apt install -y rsyslog » dans votre serveur. Regardez ensuite la configuration dans le dossier rsyslog. Dans mon cas, cela ressemble à ceci:
ls -la /etc/rsyslog.d/total 24drwxr-xr-x 2 root root 4096 Aug 21 22:41 .drwxr-xr-x 90 root root 4096 Aug 21 22:41 ..-rw-r--r-- 1 root root 314 Aug 15 2017 20-ufw.conf-rw-r--r-- 1 root root 255 Jun 3 02:08 21-cloudinit.conf-rw-r--r-- 1 root root 282 Jun 22 08:41 49-haproxy.conf-rw-r--r-- 1 root root 1124 Jan 30 2018 50-default.conf
Notez qu’il y a un fichier avec le nom « 49-haproxy.conf », qui est l’endroit où la configuration pour la journalisation HAProxy existe. Si vous ne voyez pas un tel fichier, créez-le. Voici le contenu par défaut:
$ cat /etc/rsyslog.d/49-haproxy.conf# Create an additional socket in haproxy's chroot in order to allow logging via# /dev/log to chroot'ed HAProxy processes$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfileif $programname startswith 'haproxy' then /var/log/haproxy.log&~
Vous pouvez voir que les journaux vont être écrits dans le fichier /var/log/haproxy.log. A partir de là, c’est à vous de faire quelque chose avec ces logs. Cependant, vous devrez peut-être redémarrer rsyslog et HAProxy avant de pouvoir voir certains journaux. Vous pouvez le faire en exécutant les commandes suivantes :
sudo service rsyslog restartsudo service haproxy restart
Vous devriez au moins voir quelques journaux initiaux comme ceci :
$ cat /var/log/haproxy.logAug 21 22:42:44 ip-172-31-43-203 haproxy: 233/154135 (1814) : Exiting Master process...Aug 21 22:42:44 ip-172-31-43-203 haproxy: 233/154135 (1814) : Current worker 1815 exited with code 143Aug 21 22:42:44 ip-172-31-43-203 haproxy: 233/154135 (1814) : All workers exited. Exiting... (143)
Maintenant que vous avez des journaux, il est temps de faire quelque chose avec eux. L’outil que vous utilisez pour traiter vos journaux à partir du fichier haproxy.log n’a pas d’importance. Par exemple, vous pouvez choisir un outil comme SolarWinds® Loggly®, qui dispose également d’un agent pour traiter les journaux et les envoyer automatiquement à Loggly.
Configurer les serveurs back-end
Si vous voulez faire un essai pour voir comment la journalisation fonctionne par défaut lorsque vous ajoutez plus de proxys, vous pouvez le faire en ajoutant une configuration comme la suivante à la fin du fichier haproxy.conf file:
backend webserversbalance roundrobinserver webserver1 Your-Webserver1-IP:80 checkserver webserver2 Your-Webserver2-IP:80 checkoption httpchk
Remplacez « Your-Webserver1-IP » et « Your-Webserver2-IP » par les adresses IP des serveurs vers lesquels vous souhaitez rediriger le trafic. Enregistrez les modifications et redémarrez le service HAProxy. Remarquez que nous n’avons pas eu à inclure de configuration de journalisation dans la section du proxy back-end. Vous devriez maintenant être en mesure d’envoyer du trafic vers ces serveurs back-end via HAProxy, et les journaux iront automatiquement dans le fichier haproxy.log.
Rotation des journaux avec Logrotate
Enfin, en tant que bons citoyens, nous devons nous assurer que le haproxy.log ne mange pas tout le stockage du serveur. Pour ce faire, vous pouvez utiliser logrotate. Dans mon cas, il est installé par défaut, mais vous pouvez l’installer en utilisant la commande suivante:
sudo apt-get install logrotate
Puis vous aurez un fichier de configuration comme le suivant pour nettoyer et compresser le fichier haproxy.log:
cat /etc/logrotate.d/haproxy/var/log/haproxy.log { daily rotate 52 missingok notifempty compress delaycompress postrotate invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true endscript}
Lorsque vous utilisez la configuration ci-dessus, logrotate appliquera cette règle tous les jours, en conservant tous les journaux de 52 jours ou plus récents. Il compresse également les fichiers tournés dans un format gzip. Vous n’aurez pas à vous soucier d’avoir trop de fichiers journaux sur le serveur – logrotate supprimera tous les fichiers anciens pour vous. Grâce à cette configuration simple, vous n’aurez pas à vous réveiller au milieu de la nuit pour supprimer les journaux. Cela semble être une bonne affaire, n’est-ce pas ?
Pour vous assurer que la configuration fonctionne, redémarrez HAProxy et rsyslog:
sudo service rsyslog restartsudo service haproxy restart
Conclusion
Je n’ai fait qu’effleurer la surface des options de journalisation fournies par HAProxy. Vous pouvez continuer à regarder la documentation officielle. Il y a aussi un excellent article sur le blog HAProxy qui approfondit la façon de changer le format des journaux et même comment obtenir des métriques de profilage.
Notez que j’ai utilisé un serveur Ubuntu 18.04 dans AWS, et la plupart des configurations dont j’ai parlé ici sont là par défaut. Tous les serveurs ne viendront pas de cette façon, mais au moins maintenant vous savez comment la journalisation fonctionne dans HAProxy et où se trouvent ces configurations afin que vous puissiez les modifier si nécessaire. Bonne journalisation!