Wie man HAProxy als Lastenausgleicher für Nginx unter CentOS 8 einrichtet

Um die maximale Verfügbarkeit, Skalierbarkeit und hohe Leistung von Webanwendungen sicherzustellen, ist es heute üblich, Technologien zu implementieren, die Redundanz einführen, wie z.B. Serverclustering und Lastausgleich. Zum Beispiel können Sie einen Server-Cluster einrichten, der alle denselben Anwendungen ausführt, und dann Lastausgleichsmodule davor platzieren, um den Datenverkehr zu verteilen.

HAProxy ist eine Open-Source-Lösung, die als leistungsstarke, hochleistungsfähige, zuverlässige, sichere und weit verbreitete Hochverfügbarkeits-TCP/HTTP-Lastausgleichssoftware, Proxyserver und SSL/TLS-Terminator für Webseiten mit sehr hohem Datenverkehr dient. Es läuft auf Linux, Solaris, FreeBSD, OpenBSD sowie AIX-Betriebssystemen zuverlässig gut.

Dieses Handbuch zeigt, wie Sie einen dedizierten Hochverfügbarkeits-Lastausgleich mit HAProxy auf CentOS 8 einrichten, um den Datenverkehr in einem Cluster von NGINX Webservern zu steuern. Es demonstriert auch, wie Sie SSL/TLS Beendigung in HAProxy konfigurieren.

Voraussetzungen:

A total of 4 servers with minimal CentOS 8 installation.

Testumgebung Einrichten

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

Schritt 1: Einrichten des Nginx HTTP-Servers auf den Client-Maschinen

1. Melden Sie sich bei allen Ihren CentOS 8 Client-Maschinen an und installieren Sie den Nginx Webserver mithilfe des dnf-Paketmanagers wie folgt.

# dnf install Nginx

2. Starten Sie den Nginx-Dienst, aktivieren Sie ihn vorerst, um automatisch beim Systemstart zu starten, und bestätigen Sie, dass er läuft, indem Sie seinen Status überprüfen, und verwenden Sie dazu die systemctl-Befehle (führen Sie dies auf allen Client-Maschinen aus).

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. Wenn der firewalld-Dienst auf allen Client-Maschinen läuft (was Sie durch Ausführen von systemctl start firewalld überprüfen können), müssen Sie die HTTP– und HTTPS-Dienste in der Firewall-Konfiguration hinzufügen, um Anfragen vom Lastenausgleicher durch die Firewall zu den Nginx-Webservern zu ermöglichen. Laden Sie dann den firewalld-Dienst neu, um die neuen Änderungen zu wirksam zu machen (führen Sie dies auf allen Client-Maschinen aus).

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. Öffnen Sie als nächstes einen Webbrowser auf Ihren lokalen Maschinen und testen Sie, ob die Nginx-Installation ordnungsgemäß funktioniert. Verwenden Sie die Client-IP-Adressen zum Navigieren. Sobald Sie die Testseite von Nginx sehen, bedeutet dies, dass der Webserver auf der Client-Maschine ordnungsgemäß funktioniert.

Test Nginx Installation on All CentOS 8 Client Machines

5. Als nächstes müssen wir Testseiten auf den Client-Maschinen erstellen, die wir später verwenden werden, um die HAProxy-Konfiguration zu testen.

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

Schritt 2: HAProxy-Server auf CentOS 8 installieren und konfigurieren

6. Installieren Sie nun das HAProxy-Paket auf dem HAProxy-Server, indem Sie den folgenden Befehl ausführen.

# dnf install haproxy

7. Starten Sie anschließend den HAProxy-Dienst, aktivieren Sie ihn für den automatischen Start beim Systemstart und überprüfen Sie seinen Status.

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
Verify HAProxy Status in CentOS 8

8. Jetzt konfigurieren wir die HAProxy mithilfe der folgenden Konfigurationsdatei.

# vi /etc/haproxy/haproxy.cfg

Die Konfigurationsdatei ist in vier Hauptabschnitte unterteilt.

  • globale Einstellungen – legt systemweite Parameter fest.
  • Standardeinstellungen – dieser Abschnitt legt Standardparameter für alle anderen Abschnitte fest, die auf seine Deklaration folgen.
  • Frontend – dieser Abschnitt beschreibt einen Satz von Hörsockets, die Clientverbindungen akzeptieren.
  • Backend – dieser Abschnitt beschreibt einen Satz von Servern, mit denen der Proxy Verbindungen weiterleitet.

Um die Optionen unter globale Einstellungen und Standardeinstellungen zu verstehen, lesen Sie die HAProxy-Dokumentation (Link am Ende des Artikels). Für diese Anleitung verwenden wir die Standardeinstellungen.

Einrichten der HAProxy-Protokollierung

9. HAProxy wird, sobald es bereitgestellt ist, eine wesentliche Rolle in Ihrer IT-Infrastruktur spielen, daher ist die Konfiguration der Protokollierung ein grundlegendes Erfordernis; dies ermöglicht es Ihnen, Einblicke in jede Verbindung zu Ihren Backend-Webservern zu erhalten.

Der log-Parameter (im folgenden Screenshot hervorgehoben) deklariert einen globalen Syslog-Server (wie rsyslog, standardmäßig in CentOS), der Log-Nachrichten empfangen wird. Hier können mehrere Server deklariert werden.

Die Standardkonfiguration verweist auf localhost (127.0.0.1), und local2 ist der Standard-Facility-Code, der verwendet wird, um HAProxy-Protokollnachrichten unter rsyslog zu identifizieren.

HAProxy Default Log Parameter

10. Als nächstes müssen Sie dem rsyslog-Server mitteilen, wie er HAProxy-Protokollnachrichten empfangen und verarbeiten soll. Öffnen Sie die rsyslog-Konfigurationsdatei unter /etc/rsyslog.conf oder erstellen Sie eine neue Datei im Verzeichnis /etc/rsyslog.d, zum Beispiel /etc/rsyslog.d/haproxy.conf.

# vi /etc/rsyslog.d/haproxy.conf

Kopieren und fügen Sie die folgende Konfiguration ein, um das Protokoll über UDP auf dem Standardport 514 zu sammeln.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Fügen Sie außerdem diese Zeilen hinzu, um rsyslog anzuweisen, zwei separate Protokolldateien basierend auf der Schwere zu schreiben, wobei local2 der in der obigen HAProxy-Konfiguration definierte Facility-Code ist.

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11. Speichern und schließen Sie die Datei. Starten Sie dann den rsyslog-Dienst neu, um die aktuellen Änderungen zu übernehmen.

# systemctl restart rsyslog

Konfiguration von HAProxy-Frontends und Backends

12. In diesem Abschnitt werden wir zeigen, wie man die Front-End- und Back-End-Proxys konfiguriert. Gehen Sie zurück zur HAProxy-Konfigurationsdatei und ändern Sie die Standard-Front-End- und Back-End-Abschnitte wie folgt. Wir werden nicht detailliert auf jeden Parameter eingehen, Sie können sich jederzeit an die offizielle Dokumentation wenden.

Die folgende Konfiguration definiert einen Listen-Abschnitt, der verwendet wird, um die HAProxy-Statistik-Seite bereitzustellen. Der Bind-Parameter weist einem bestimmten IP-Adresse (* in diesem Fall) und Port (9000) einen Listener zu.

Die Einstellung Enable für die Statistiken aktiviert die Statistikseite, die über die URI /stats aufgerufen wird (d. h. http://server_ip:9000/stats).

Die Einstellung Auth wird verwendet, um eine grundlegende Authentifizierung beim Zugriff auf die Seite hinzuzufügen (ersetzen Sie haproxy und Lostp@1ss durch einen Benutzernamen und ein Passwort Ihrer Wahl).

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:Lostp@1ss

13. Die nächste Konfiguration definiert einen Frontend-Abschnitt namens TL (Sie können einen Namen Ihrer Wahl geben). Der Mode-Parameter definiert den Modus, in dem HAProxy arbeitet.

Der Acl (Zugriffssteuerungsliste) Parameter wird verwendet, um basierend auf dem aus der Anfrage extrahierten Inhalt eine Entscheidung zu treffen. In diesem Beispiel wird die Anfrage als einfaches HTTP betrachtet, wenn sie nicht über SSL erfolgt.

Dann wird die Einstellung http-request set-header verwendet, um der Anfrage einen HTTP-Header hinzuzufügen. Dadurch wird Nginx mitgeteilt, dass die ursprüngliche Anfrage über HTTP (oder über Port 80) erfolgte.

Die Anweisung default_backend oder use_backend definiert die Backend-Server, in diesem Fall referenziert durch TL_web_servers.

Beachten Sie, dass HAProxy einen „503 Service nicht verfügbar Fehler“ zurückgibt, wenn eine Anfrage nicht durch eine use_backend oder default_backend Anweisung geroutet wird.

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14. Dann müssen wir einen Backend-Abschnitt definieren, in dem die Bilanz Einstellung festlegt, wie HAProxy die Backend-Server auswählt, um eine Anfrage zu verarbeiten, wenn keine Persistenzmethode diese Auswahl außer Kraft setzt.

Die Anweisung cookie ermöglicht eine Cookie-basierte Persistenz, sie weist HAProxy an, dem Client ein Cookie mit dem Namen SERVERID zu senden und es mit der ID des Servers zu verknüpfen, der die ursprüngliche Antwort gegeben hat.

Die Server-Direktive wird verwendet, um die Upstream-Server im Format Servername (z.B websrv1) und Server-IP:Port sowie Optionen zu definieren.

Eine wichtige Option ist check, die HAProxy anweist, die Verfügbarkeit eines Servers fortlaufend zu überprüfen und auf der Statistikseite zu berichten.

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

Kommentieren Sie alle anderen Frontend- und Backend-Abschnitte wie im folgenden Screenshot gezeigt aus. Speichern Sie die Datei und schließen Sie sie.

Configuring HAProxy Front-end and Back-ends

15. Starten Sie nun den HAProxy-Dienst neu, um die neuen Änderungen anzuwenden.

# systemctl restart haproxy

16. Als Nächstes stellen Sie sicher, dass die HTTP-Dienste (Port 80) und HTTPS (Port 433) im Firewall-Regelwerk geöffnet sind, um Clientanfragen entgegenzunehmen. Öffnen Sie außerdem den Port 9000 im Firewall-Regelwerk für den Zugriff auf die Statistikseite und laden Sie die Firewall-Einstellungen neu.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

Schritt 3: Testen der HAProxy-Einrichtung und Anzeigen der Statistiken

17. Nun ist es an der Zeit, die HAPrxoy-Einrichtung zu testen. Fügen Sie auf dem lokalen Desktop-Rechner, von dem aus Sie auf alle Server zugreifen, die folgende Zeile in die /etc/hosts-Datei ein, um es uns zu ermöglichen, das Dummy-Site-Domain zu verwenden.

10.42.0.247  www.tecmint.lan

18. Öffnen Sie dann einen Browser und navigieren Sie entweder mit der Serveradresse oder der Site-Domain.

http://10.42.0.247/
OR
http://www.tecmint.lan/
Check HAProxy Setup

19. Um auf die HAProxy-Statistikseite zuzugreifen, verwenden Sie die folgende Adresse.

http://10.42.0.247:9000/stats

Verwenden Sie dann den Benutzernamen und das Passwort, die Sie in der HAProxy-Konfigurationsdatei definiert haben (beziehen Sie sich auf den stats auth-Parameter).

HAProxy Stats Login Page

Nach einem erfolgreichen Login landen Sie auf der Statistikseite von HAProxy, die Ihnen Metriken zeigt, die die Gesundheit Ihrer Server, aktuelle Anfrage-Raten, Antwortzeiten und vieles mehr abdecken.

Um zu demonstrieren, wie der Statusbericht in Bezug auf die Farbcodes funktioniert, haben wir einen der Backend-Server eingerichtet.

HAProxy Statistics Report

Schritt 4: Konfigurieren von HTTPS in HAProxy mit einem selbstsignierten SSL-Zertifikat

20. In diesem abschließenden Abschnitt werden wir zeigen, wie man SSL/TLS konfiguriert, um alle Kommunikationen zwischen dem HAProxy-Server und dem Client zu sichern. HAProxy unterstützt vier Hauptkonfigurationsmodi für HTTPS, aber für diese Anleitung werden wir die SSL/TLS-Entlastung verwenden.

Im SSL/TLS-Entlastungsmodus entschlüsselt HAProxy den Datenverkehr auf der Client-Seite und stellt eine klare Verbindung zu den Backend-Servern her.

Wir beginnen damit, das Zertifikat und den Schlüssel wie gezeigt zu erstellen (beantworten Sie die Fragen entsprechend basierend auf den Unternehmensdetails während der Zertifikatserstellung, wie auf dem Screenshot hervorgehoben).

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l
Create SSL for HAProxy

21. Öffnen Sie als nächstes die HAProxy-Konfigurationsdatei (/etc/haproxy/haproxy.cfg) und bearbeiten Sie den Front-End-Abschnitt.

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers
Configure HAProxy Front-end with SSL

Speichern Sie die Datei und schließen Sie sie.

22. Starten Sie dann den HAProxy-Dienst neu, um die neuen Änderungen anzuwenden.

# systemctl restart haproxy.service

23. Öffnen Sie anschließend einen Webbrowser und versuchen Sie erneut, auf die Website zuzugreifen. Der Browser zeigt einen Fehler aufgrund des selbstsignierten Zertifikats an, klicken Sie auf Erweitert, um fortzufahren.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

Das war’s fürs Erste! Jede Webanwendung hat ihre eigenen Anforderungen. Sie müssen das Lastenausgleichsdesign entsprechend Ihrer IT-Infrastruktur und den Anforderungen der Anwendung gestalten und konfigurieren.

Um weitere Einblicke in einige der in diesem Leitfaden verwendeten Konfigurationsoptionen zu erhalten und allgemein zu erfahren, wie man HAProxy verwendet, sehen Sie sich die offizielle HAProxy Community Edition Dokumentation oder HAProxy Enterprise Version Dokumentation an. Sie können Fragen oder Gedanken über das unten stehende Feedback-Formular posten.

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/