HAProxy ist ein Open-Source-Load-Balancer mit sehr beeindruckender Leistung. Es wird als Frontend für sogar weltumspannende Webanwendungen wie Twitter verwendet. Es kann Netzwerkanwendungen über TCP (Layer 3) und HTTP (Layer 7) ausgleichen. Es leitet bei Bedarf auch Anfragen an aktive Serverinstanzen um und bietet daher Hochverfügbarkeit (HA).
E2E Networks bietet bestimmte Knoten mit Rechenleistung, die für den Betrieb eines Hochleistungs-Load-Balancers wie HAProxy geeignet sind. Diese Knoten werden als Virtual Load Balancer (VLB)-Knoten bezeichnet. In diesem Blog erklären wir, wie HAProxy auf einem Virtual Load Balancer-Knoten in der E2E Cloud eingerichtet wird. Wir werden HAProxy auf Layer 7 verwenden, um PHP-Anwendungen, die auf Apache-Webservern ausgeführt werden, als Frontend zu verwenden. Im zweiten und abschließenden Teil dieses Blogs werden wir einige zusätzliche Schritte durchgehen, die die meisten Website-Administratoren über die grundlegende Einrichtung hinaus ausführen müssen. Diese zusätzlichen Schritte sind:Implementieren von Session-Stickiness und Sichern des Zugriffs auf die Website mit SSL. Diese beiden Blogs sind größtenteils in sich abgeschlossen und sollten zusammen Systemadministratoren helfen, HAProxy reibungslos als Front-End-Load-Balancer für Webanwendungen einzurichten, die in E2E Cloud bereitgestellt werden.
Installation und grundlegende Einrichtung
Obwohl unser Fokus auf HAProxy liegt, beginnen wir mit der Installation von zwei Webservern, an die HTTP-Anfragen weitergeleitet werden können. Nachdem wir uns bei unserem E2E Networks Dashboard angemeldet haben, folgen wir den Links zu „Create Node“ und wählen eine Ubuntu 16.04-Distribution mit 1 CPU und 2 GB RAM aus . Dieser virtuelle Rechenknoten soll „websrv1“ heißen ‘. Dann rufen wir einen weiteren identischen Knoten auf, um eine zweite Webserverinstanz mit dem Namen „websrv2“ zu installieren ‘. Auf jedem Webserver-Knoten installieren wir Apache 2.4 und PHP, indem wir die folgenden Befehle auf dem Terminal (von jedem Webserver-Knoten) ausführen:
- apt-get update
- apt-get install apache2 # Webserver installieren
- apt-get install php libapache2-mod-php php-mcrypt # php und verwandte Pakete
- systemctl enable apache2 # aktiviert den Webserver, um beim Systemneustart zu starten
- systemctl restart apache2 # Webserver neustarten
- systemctl status apache2 # prüfen, ob der Webserver aktiv ist
Um zu testen, ob die Webserverinstanzen PHP servern können, erstellen wir auf jedem Webserver mit dem vi-Editor eine einfache PHP-Datei im Dokumentenstammverzeichnis (/var/www/html-Verzeichnis). :
Begrüßer
echo „Hallo Welt“;
?>
Nun, wenn wir unseren Browser auf http://
Also sind wir bereit, HAProxy als Frontend für die Webserver zu installieren. Von unserem E2E-Netzwerk-Dashboard aus erstellen wir erneut einen Knoten, diesmal jedoch von einer „Appliance“. Wir wählen eine Appliance vom Typ „Load Balancing HAProxy“. Es gibt mehrere verfügbare Konfigurationen, von denen wir VLB-B-1 (5 VCPUs und 4 GB RAM) für unsere HAProxy-Instanz auswählen.
Abbildung 1:Erstellen eines virtuellen Load-Balancer-Knotens
Die VLB-Knoten in E2E Cloud sind leistungsstarke Rechenknoten, die auf CentOS 7 ausgeführt werden. Um HAProxy auf jedem dieser Knoten zu installieren, führen wir die folgenden Befehle auf dem Terminal aus:
- yum install haproxy # installiere HAProxy
- systemctl enable haproxy # aktiviert HAProxy, um beim Systemneustart zu starten
- systemctl restart haproxy # HAProxy neu starten
- systemctl status haproxy # prüfen, ob HAProxy betriebsbereit ist
In unserer Bereitstellung benötigen wir zwei zusätzliche Pakete, damit HAProxy funktioniert:syslog und openssl. Da die VLB-Knoten (die auf CentOS laufen) mit diesen beiden Paketen vorinstalliert sind, ist kein zusätzlicher Installationsschritt erforderlich. Wir benötigen jedoch ein paar Konfigurationsschritte für HAProxy, bevor das Load-Balancing funktioniert.
Allgemeine HAProxy-Konfiguration
Die HAProxy-Konfigurationsdatei befindet sich unter /etc/haproxy/haproxy.cfg und enthält einige Standardeinstellungen, von denen einige möglicherweise angepasst werden müssen. Für diese Konfigurationsdatei wird erwartet, dass mindestens ein „Frontend“ und mindestens ein „Backend“ definiert sind. Jedes Front-End wird auf ein oder mehrere Back-Ends verteilt. Ein Backend besteht aus mehreren Webservern, die aus Gründen der Skalierbarkeit und Redundanz dieselbe Webanwendung bedienen. Aber es gibt auch einen Abschnitt in dieser Datei mit der Bezeichnung „generic“, der sich auf die gesamte HAProxy-Installation bezieht, und einen Abschnitt „defaults“, der Parameterwerte angibt, die für alle gelten Frontend und Backends hier definiert.
Max. Verbindungen :Im Abschnitt „global“ setzen wir den Parameter „maxconn“ (die maximale Anzahl von Client-Verbindungen, die dieser Load Balancer über alle verarbeiten kann Backends, auf die es ausgerichtet ist). Dieser Parameter kann mithilfe der HAProxy-Größenrichtlinien festgelegt werden , oder umgekehrt, wir können einen VLB-Knoten von E2E Cloud auswählen, basierend auf der erwarteten Spitzenlast, auf die unsere Website stoßen könnte. Mit unserem ausgewählten VLB-B-1 node, 4096 ist ein sinnvoller Wert für ‚maxconn‘ auf globaler Ebene.
Abbildung 2:Globale und Standardkonfigurationsparameter für HAProxy
Protokoll: In unserer Bereitstellung fängt HAProxy den HTTP-Datenverkehr ab und verteilt ihn. Dies wird durch Festlegen des Modus im Abschnitt „Standardeinstellungen“ oben konfiguriert.
Modus http
Protokollierung :Es wird empfohlen, dass HAProxy syslog verwendet . Unter CentOS bedeutet dies, den Parameter „log“ auf „local2“ zu setzen, wie im obigen Screenshot gezeigt. Außerdem muss die Syslog-Konfiguration auf dem HAProxy-Knoten (/etc/rsyslog.conf) ebenfalls so geändert werden, dass sie auf dem UDP-Port 514 lauscht.
Abbildung 3:Syslog-Konfiguration auf dem HAProxy-Knoten
Um sicherzustellen, dass alle Meldungen auf 'local2' in eine separate Datei exklusiv für HAProxy (/var/log/haproxy.log) protokolliert werden, müssen wir eine Datei haproxy.conf im Verzeichnis / erstellen. etc/rsyslog.d und geben Sie die folgende Zeile ein:
local2.* /var/log/haproxy.log
Für die End-to-End-Verfolgbarkeit von Anfragen sollten wir auch das Apache-Webserver-Protokollformat in der Webserver-Konfigurationsdatei (/etc/apache2/apache2.conf) optimieren. Auf jedem Webserver-Knoten ändern wir LogFormat so, dass es die tatsächliche Client-Adresse (X-Forwarded-For) enthält, von der die HTTP-Anforderung stammt (anstatt die IP-Adresse des HAProxy-Knotens anzuzeigen).
Abbildung 4:Apache-Webserver-Protokollformat
HAProxy-Statistiken :HAProxy kann so konfiguriert werden, dass Anforderungsstatistiken auf einer webbasierten Benutzeroberfläche angezeigt werden. Wir können eine URL zum Anzeigen von HAProxy-Statistiken (/lb-stats) festlegen, die mit der Standardauthentifizierung geschützt sind.
Andere Standardeinstellungen :Der Abschnitt „Standardeinstellungen“ enthält eine Reihe von Timeout-Parametern die wir unverändert gelassen haben. Aber in der Produktion möchte jeder Site-Administrator die Zeitüberschreitungen basierend auf Faktoren wie Netzwerklatenz, Verarbeitungszeit am Serverende usw. fein abstimmen. Wir haben die Option „httpclose“ eingeführt, damit HTTP-Client-Verbindungen so schnell wie möglich geschlossen werden als Antwort zurückgesendet wird, ohne unnötig Ressourcen zu verbrauchen (es sei denn, es gibt eine Keep-Alive-Einstellung für HTTP-Verbindungen). Und wir haben dafür gesorgt, dass die tatsächliche Client-IP-Adresse zur Rückverfolgbarkeit vollständig an den Webserver weitergeleitet wird (unter Verwendung des Parameters „option forwardfor“). Für detaillierte Definitionen der HAProxy-Konfigurationsparameter, HAProxy Dokumentation konsultiert werden.
Einfacher Round-Robin-Load-Balancing
Anfangs haben wir nur eine einzige Website eingerichtet (bestehend aus der zuvor erwähnten einfachen PHP-Greeter-App), die von unserer HAProxy-Installation mit Lastenausgleich versehen wird. Wir haben bereits zwei Webserver und einen Load-Balancer (HAProxy) eingerichtet, wie im E2E Cloud Dashboard aufgeführt.
Abbildung 5:Webserver- und Load-Balancer-Knoten
Zuerst binden wir HAProxy an eine geeignete IP-Adresse und einen geeigneten Port (normalerweise Port 80 für den HTTP-Modus) auf unserem VLB-Knoten . Die IP-Adresse muss nach außen gerichtet sein, um Client-Anfragen zu akzeptieren. Dies führt uns dazu, ein ‚Frontend‘ mit dem Namen ‚httptraffic‘ zu definieren, wie das folgende (in /etc/haproxy/haproxy.cfg). Hier gleicht dieses Frontend standardmäßig alle Client-Anforderungen an das Backend mit dem Namen „site“ aus.
Abbildung 6:Frontend-Konfiguration für HAProxy
Also müssen wir natürlich ein ‚Backend‘ namens ‚Site‘ definieren. Es sollte aus den IP-Adressen von Webservern bestehen, an die Anfragen weitergeleitet werden (obwohl wir interne/private Adressen verwenden sollten für diesen Zweck). Und wir geben die Load-Balancing-Richtlinie als „Round-Robin“ an. HAProxy ermöglicht uns auch, regelmäßige Gesundheitsprüfungen zu aktivieren der Backend-Knoten mit dem ‚check‘-Parameter.
Abbildung 7:Backend-Konfiguration für HAProxy
An diesem Punkt müssen wir Syslog und HAProxy auf dem Load-Balancer-Knoten neu starten:
- systemctl startet rsyslog neu
- systemctl startet Haproxy neu
Firewall-Einstellungen
Bevor wir über HAProxy auf die Webanwendung zugreifen, müssen wir den Port 80 (für HAProxy, der für den HTTP-Modus eingerichtet ist) auf dem virtuellen Load Balancer-Knoten und den UDP-Port 514 für Syslog öffnen. Unter CentOS erfordert dies die Einrichtung der iptables passend:
- iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
- iptables -A INPUT -i eth0 -p udp –dport 514 -j ACCEPT
- iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
- systemctl startet iptables neu
Testen
In diesem Stadium können wir tatsächlich die Load-Balancing-Funktionalität und einige der im vorherigen Abschnitt erwähnten Konfigurationseinstellungen (einschließlich Protokollierung und Statistikerfassung) testen.
Um Anfragen zu erkennen, die auf HAProxy landen, führen wir den folgenden Befehl auf dem Load-Balancer-Knoten aus:
- tail -f /var/log/haproxy.log
Für HAProxy wird diese Protokolldatei (/var/log/haproxy.log) über Syslog aktualisiert.
In ähnlicher Weise können wir die Zugriffsprotokolle auf jedem Webserverknoten überprüfen, um die Anfrage von Anfang bis Ende zu verfolgen.
- tail -f /var/log/apache2/access.log
Jetzt greifen wir von zwei verschiedenen Rechnern auf die einfache PHP-Greeter-Anwendung zu . Auf jedem Client-Rechner können wir einen Browser auf die URL verweisen:
http://
Wir sollten Aktualisierungen der HAProxy-Protokolle finden. (Dies bestätigt auch, dass unsere Syslog-Konfiguration funktioniert.)
Abbildung 8:HAProxy-Protokolle (Round-Robin-Load-Balancing)
Eine der Anfragen wird vom Knoten websrv1 bedient, während die andere vom Knoten websrv2 bedient wird. Dies ist aus den Zugriffsprotokollen auf jedem Webserver und durch genaue Übereinstimmung der Zeitstempel ersichtlich. Die Client-IP-Adressen werden auch im HAProxy und in den Webserver-Protokollen protokolliert.
Abbildung 9:Zugriffsprotokolle von Knoten:websrv1
Abbildung 10:Zugriffsprotokolle von Knoten:websrv2
Die folgenden Begrüßungen werden auf jedem im Browser angezeigt Client-Rechner:
Abbildung 11:Browseranzeige
Load-Balancer-Statistiken :Endlich können wir uns die HAProxy-Statistiken ansehen indem Sie unseren Browser auf die folgende URL verweisen (konfiguriert im Abschnitt „Standardeinstellungen“):
http://
Abbildung 12:Load-Balancer-Statistiken
Schlussfolgerung und nächste Schritte
Bisher haben wir mit HAProxy erfolgreich Load-Balancing in der E2E-Cloud eingerichtet. Im nächsten (und abschließenden) Teil dieses Blogs werden wir diese Konfiguration auf die nächste Ebene bringen, indem wir Sticky Sessions und sicheren Zugriff auf die Website aktivieren und auch eine größere Website mit mehreren Anwendungen einrichten. Diese Schritte bringen uns einer Produktionsbereitstellung näher.
Bitte folgen Sie dem Link unten, um Schritt 2 anzuzeigen:
Verwenden von HAProxy für den Lastenausgleich in der E2E-Cloud:Sitzungsbindung und -sicherheit