- Einführung
- Voraussetzungen
- Schritt 1 – Installation und Aktivierung von HAProxy
- Schritt 2 – Konfigurieren der HAProxy-Protokollierungsrichtlinien
- Schritt 3 – Rsyslog zum Sammeln von HAProxy-Logs konfigurieren
- Schritt 4 – (Optional) SELinux konfigurieren
- Schritt 5 – Testen der HAProxy-Protokollierung
- Schlussfolgerung
Einführung
HAProxy, was für High Availability Proxy steht, ist ein weit verbreiteter TCP- und HTTP-basierter Proxy-Server, der unter Linux, Solaris und FreeBSD läuft. Er wird für den Lastausgleich von Anwendungen verwendet, indem er Anfragen auf mehrere Server verteilt und sicherstellt, dass die Anwendungen für die Benutzer hochverfügbar sind.
Standardmäßig ist HAProxy bei vielen CentOS 8-Installationen nicht so konfiguriert, dass er seine Log-Ausgaben in eine Datei schreibt. In diesem Schnellstart-Tutorial wird erklärt, wie man die HAProxy-Protokollierung mit Rsyslog konfiguriert, indem ein Unix-Domain-Socket für Zuverlässigkeit, Geschwindigkeit und Sicherheit verwendet wird.
Voraussetzungen
Um dieses Tutorial durchzuführen, benötigen Sie einen Server, auf dem CentOS 8 läuft. Dieser Server sollte über einen Nicht-Root-Benutzer mit administrativen Rechten verfügen. Um diesen einzurichten, folgen Sie der Anleitung zur Ersteinrichtung des Servers für CentOS 8.
Schritt 1 – Installation und Aktivierung von HAProxy
Um HAProxy zu installieren, führen Sie den folgenden dnf
Befehl aus:
- sudo dnf install haproxy
Wenn Sie dazu aufgefordert werden Is this ok :
geben Sie y
ein und drücken Sie RETURN
, um das Paket zu installieren.
Nachdem Sie HAProxy installiert haben, aktivieren und starten Sie es mit dem Befehl systemctl
:
- sudo systemctl enable haproxy.service
Sie sollten die folgende Ausgabe erhalten:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Da der HAProxy-Dienst nun aktiviert ist, können Sie ihn starten, um sicherzustellen, dass er mit einer Standardkonfiguration auf Ihrem Server ausgeführt wird:
- sudo systemctl start haproxy.service
Überprüfen Sie als Nächstes den Status von HAProxy, um sicherzustellen, dass er ausgeführt wird:
- sudo systemctl status haproxy.service
Sie sollten folgende Ausgabe erhalten. Beachten Sie den hervorgehobenen Teil active (running)
der Ausgabe. Wenn Ihr Server denselben hervorgehobenen Abschnitt anzeigt, wird HAProxy auf Ihrem Server korrekt ausgeführt, und Sie können mit der Konfiguration der Protokollierung fortfahren.
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. . .
Wenn Ihre Ausgabe anders aussieht oder der Status etwas wie Active: failed
anzeigt, befolgen Sie die Schritte zur Fehlerbehebung in der Anleitung zur Behebung häufiger HAProxy-Fehler, um festzustellen, was den korrekten Start von HAProxy verhindert.
Wenn Sie sichergestellt haben, dass HAProxy aktiviert ist und läuft, können Sie mit dem nächsten Schritt fortfahren, nämlich der Konfiguration der Protokollierungsrichtlinien von HAProxy.
Schritt 2 – Konfigurieren der HAProxy-Protokollierungsrichtlinien
Um die Protokollierungsrichtlinien von HAProxy zu konfigurieren, öffnen Sie /etc/haproxy/haproxy.cfg
in vi
oder Ihrem bevorzugten Editor:
- sudo vi /etc/haproxy/haproxy.cfg
Drücken Sie i
, um in den Modus INSERT
zu wechseln, suchen Sie dann die Zeile log 127.0.0.1 local2
und kommentieren Sie sie aus, indem Sie ein #
-Zeichen an den Anfang der Zeile setzen, wie im folgenden Beispiel hervorgehoben:
. . .# 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. . .
Fügen Sie nun eine Zeile direkt nach der auskommentierten Zeile mit folgendem Inhalt ein:
log /dev/log local0
Der gesamte Abschnitt von /etc/haproxy/haproxy.cfg
, den Sie bearbeitet haben, sollte die folgenden Zeilen enthalten:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
Die Zeile chroot
ist wichtig, weil sie den HAProxy-Prozess darauf beschränkt, nur auf Dateien im Verzeichnis /var/lib/haproxy
zuzugreifen. Die Zeile log /dev/log local0
erstellt eine Datei in diesem Verzeichnis, die von Rsyslog zum Sammeln von Protokolleinträgen verwendet wird.
Wenn Sie die Bearbeitung der log
Zeilen in /etc/haproxy/haproxy.cfg
abgeschlossen haben, speichern und schließen Sie die Datei, indem Sie ESC
drücken, :wq
eingeben und ENTER
drücken.
Der letzte Schritt, den Sie in diesem Abschnitt ausführen müssen, ist das Erstellen des Verzeichnisses /var/lib/haproxy/dev
, da es standardmäßig nicht existiert.
Erstellen Sie das Verzeichnis mit dem Befehl mkdir
und starten Sie dann HAProxy neu:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Sie haben nun HAProxy so konfiguriert, dass es seine Protokolle an einen Unix-Domänen-Socket sendet, der sich in /var/lib/haproxy/dev/log
befindet. Im nächsten Schritt werden Sie Rsyslog so konfigurieren, dass es den Socket erstellt und darauf zugreift.
Schritt 3 – Rsyslog zum Sammeln von HAProxy-Logs konfigurieren
Die Standardkonfiguration von Rsyslog unter CentOS 8 verarbeitet keine HAProxy-Logs. Um Logs vom HAProxy-Dienst zu sammeln, öffnen Sie eine neue Datei /etc/rsyslog.d/99-haproxy.conf
mit vi
oder Ihrem bevorzugten Editor:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Drücken Sie i
, um in den Modus INSERT
zu wechseln, und fügen Sie die folgenden Zeilen in die Datei ein:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
Die $AddUnixListenSocket
Direktive weist Rsyslog an, einen Unix-Domain-Socket an dem angegebenen Ort zu erstellen, in diesem Fall /var/lib/haproxy/dev/log
. Der Abschnitt :programname, startswith, "haproxy"
gibt die Datei an, in die Rsyslog die Log-Einträge schreibt, die es vom Socket sammelt.
Wenn Sie mit der Bearbeitung von /etc/rsyslog.d/99-haproxy.conf
fertig sind, speichern und schließen Sie die Datei, indem Sie ESC
drücken, :wq
eingeben und ENTER
drücken.
Sie haben nun Rsyslog so konfiguriert, dass es Log-Einträge vom Unix-Domain-Socket in /var/lib/haproxy/dev/log
liest und sie in eine Log-Datei in /var/log/haproxy.log
schreibt.
Bevor Sie jedoch Rsyslog neu starten, müssen Sie feststellen, ob SELinux die Zugriffskontrolle auf Ihrem CentOS 8-System durchsetzt.
Um die aktuelle Richtlinie von SELinux zu überprüfen, führen Sie Folgendes aus:
- getenforce
Sie erhalten eine der folgenden Ausgaben:
-
Enforcing
– In diesem Modus setzt SELinux die Zugriffskontrolle auf Ihrem System durch. Sie müssen den folgenden optionalen Abschnitt Schritt 4 – Konfigurieren von SELinux ausfüllen. -
Permissive
– In diesem Fall protokolliert SELinux alle Zugriffsversuche in seiner Protokolldatei, setzt aber keine Zugriffskontrollen auf Ihrem System durch. -
Disabled
– Wenn SELinux deaktiviert ist, werden keine Zugriffskontrollrichtlinien auf Ihrem System protokolliert oder durchgesetzt.
Wenn der Befehl getenforce
entweder Permissive
oder Disabled
zurückgegeben hat, können Sie Rsyslog mit dem folgenden Befehl neu starten:
- sudo systemctl restart rsyslog
Nach dem Neustart von Rsyslog können Sie die Protokolle in der /var/log/haproxy.log
-Datei anzeigen, die Sie in /etc/rsyslog.d/99-haproxy.conf
konfiguriert haben. Fahren Sie mit Schritt 5 – Testen der HAProxy-Protokollierung fort, um sicherzustellen, dass alles wie erwartet funktioniert.
Wenn Ihr System unter SELinux im Modus Enforcing
läuft, wird im nächsten Abschnitt dieses Tutorials erklärt, wie man ein Modul hinzufügt, damit Rsyslog und HAProxy über ihren gemeinsamen Unix-Domain-Socket miteinander kommunizieren können.
Schritt 4 – (Optional) SELinux konfigurieren
Wenn Ihr CentOS 8 System mit SELinux im Modus Enforcing
konfiguriert ist, dann müssen Sie Rsyslog den Zugriff auf das chroot
Verzeichnis von HAProxy erlauben. Wenn Sie diesen Zugriff zulassen, kann Rsyslog den Unix-Domain-Socket erstellen, an den HAproxy seine Protokolle sendet.
Wenn Sie mit SELinux nicht vertraut sind, hilft Ihnen diese Tutorial-Serie An Introduction to SELinux on CentOS 7 dabei, die Verwaltung und Interaktion mit SELinux zu erlernen. Obwohl sie für CentOS 7 geschrieben wurde, sind die Prinzipien und Befehle in der Serie auch auf CentOS 8 anwendbar.
Um den Zugriff von Rsyslog und HAProxy auf ihren gemeinsamen Socket zu ermöglichen, müssen Sie zunächst eine Type Enforcement Policy-Datei erstellen. Öffnen Sie eine neue Datei mit dem Namen rsyslog-haproxy.te
in vi
oder Ihrem bevorzugten Editor:
- vi rsyslog-haproxy.te
Drücken Sie i
, um in den Modus INSERT
zu wechseln, und fügen Sie dann die folgenden Zeilen in die Datei ein:
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 };
Die erste Zeile definiert den Modulnamen und die Version. Der Teil require
teilt dem SELinux-Modullader die Typen und Klassen mit, die erforderlich sind, damit die Richtlinie als Modul geladen werden kann. Die letzten beiden Zeilen sind die Regeln, die den Zugriff von Rsyslog auf die chroot
– bzw. Socket-Datei von HAProxy erlauben.
Wenn Sie mit der Bearbeitung der Datei fertig sind, speichern und schließen Sie sie, indem Sie ESC
drücken, :wq
eingeben und ENTER
drücken.
Als Nächstes führen Sie den folgenden Befehl aus, um das Paket checkpolicy
zu installieren, das das Dienstprogramm checkmodule
enthält, mit dem Sie die Type Enforcement-Datei in ein SELinux-Modul umwandeln können.
- sudo dnf install checkpolicy
Nachdem Sie das Dienstprogramm checkmodule
installiert haben, besteht der nächste Schritt darin, das Modul zu kompilieren und es dann in SELinux zu laden. Führen Sie Folgendes aus, um die Type Enforcement-Datei in ein SELinux-Modul zu kompilieren:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Als Nächstes führen Sie semodule_package
aus, um ein vollständiges Richtlinienpaket zu generieren, das SELinux in den Linux-Kernel laden kann:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
Der letzte Schritt besteht darin, das generierte Paket mit dem Befehl semodule
in den Linux-Kernel zu laden:
- sudo semodule -i rsyslog-haproxy.pp
Das Hinzufügen des Moduls kann einige Sekunden dauern. Sobald der Befehl abgeschlossen ist, können Sie bestätigen, dass das Modul in den Kernel geladen wurde, indem Sie den Befehl semodule
ausführen:
- sudo semodule -l |grep rsyslog-haproxy
Sie sollten eine Ausgabe wie die folgende erhalten:
Outputrsyslog-haproxy
Wenn das Modul geladen ist, können Sie Rsyslog mit dem folgenden Befehl neu starten:
- sudo systemctl restart rsyslog
Sie haben nun eine SELinux-Richtlinie definiert, kompiliert und geladen, die es HAProxy und Rsyslog ermöglicht, über ihren gemeinsamen Socket zu kommunizieren.
Im nächsten Schritt werden Sie testen, ob alles funktioniert, indem Sie eine HTTP-Anfrage an HAProxy stellen und dessen neue Protokolldatei untersuchen.
Schritt 5 – Testen der HAProxy-Protokollierung
Nachdem Sie nun HAProxy, Rsyslog und optional SELinux konfiguriert haben, können Sie testen, ob die Protokollierung an /var/log/haproxy.log
funktioniert.
Standardmäßig wird das Paket haproxy
mit einer Konfigurationsdatei ausgeliefert, die einen HTTP-Listener-Socket an Port 5000 erstellt. Die Konfiguration verweist auf einen nicht existierenden Backend-Server, so dass jede Anfrage an den Port zu einem HTTP 503-Fehler führen wird.
Um nach einem 503-Fehler in Ihrer /var/log/haproxy.log
-Datei zu suchen, erzeugen Sie zunächst eine HTTP-Anfrage mit curl
wie folgt:
- curl -si http://127.0.0.1:5000
Sie sollten eine Ausgabe wie die folgende erhalten:
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>
Untersuchen Sie nun /var/log/haproxy.log
mit dem Befehl grep
auf HTTP 503-Antworten:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Hinweis: Der NOSRV.+503
-Teil des Befehls ist ein regulärer Ausdruck. Dieses Tutorial über die Verwendung von Grep & Reguläre Ausdrücke für die Suche nach Textmustern in Linux
geht näher auf die Verwendung von grep
und regulären Ausdrücken ein.
Sie sollten eine Zeile (oder mehrere Zeilen) wie die folgende erhalten:
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"
Diese Zeile entspricht der curl
Anfrage, die Sie gestellt haben, was bedeutet, dass Rsyslog und HAProxy so konfiguriert sind, dass sie ihren gemeinsamen Socket korrekt verwenden.
Schlussfolgerung
In diesem Schnellstart-Tutorial haben Sie HAProxy so konfiguriert, dass es an einem Unix-Domain-Socket protokolliert. Außerdem haben Sie Rsyslog so eingerichtet, dass es den Socket erstellt und aus ihm liest, so dass die beiden Programme miteinander kommunizieren können, ohne TCP/IP-Ports auf Ihrem System zu öffnen. Schließlich haben Sie optional eine SELinux-Richtlinie kompiliert, gepackt und geladen, um Rsyslog und HAProxy den gemeinsamen Zugriff auf ihr Socket zu ermöglichen.