7 Minuten Lesezeit (1356 Worte)

Hochverfügbarkeit und Skalierbarkeit mit HAProxy: Die Lösung für Ihre Herausforderungen

Als Anbieter einer Web-Plattform steht man vor drei wichtigen Herausforderungen: Die Plattform muss sicher, zuverlässig und skalierbar sein, um auf wachsenden Erfolg reagieren zu können. Hier bietet sich die Software „HAProxy“, ein schneller und zuverlässiger Reverse-Proxy, als Lösung an.

Über HAProxy

HAProxy wurde explizit als Reverse-Proxy entwickelt und zeichnet sich daher durch seine Geschwindigkeit und Zuverlässigkeit aus. Auch sind die Anforderungen an die Hardware, auf der die Software ausgerollt wird, vergleichsweise niedrig. Da HAProxy als Load-Balancer in hochverfügbaren Umgebungen entwickelt wurde, ist er in der Lage große Datenmengen sehr effizient zu verarbeiten. Hierbei ist erwähnenswert, dass HAProxy nicht nur für das http-Protokoll eingesetzt werden kann, sondern ebenfalls auch für andere Anwendungen, die über TCP kommunizieren.

Damit kann HAProxy als schneller und zuverlässiger Zugangspunkt aller Web-Anwendungen, die eine Plattform zur Verfügung stellen, genutzt werden. So hat man eine zentrale Instanz, die die Anfragen an den geeigneten Service weiterleitet und behält dabei ein Höchstmaß an Flexibilität für den Fall, dass neue Dienste hinzugefügt werden oder bei bestehenden Diensten weitere Ressourcen (wie zum Beispiel zusätzliche Server) hinzugefügt werden müssen.

Die Software existiert bereits seit dem Anfang 2001 und wird seither unter der GNU General Public License frei und kostenlos allen Nutzern zur Verfügung gestellt. Seit 2013 können auch kommerzieller Support und ergänzende Features erworben werden.

HAProxy steht für zahlreiche Plattformen zur Verfügung, darunter Linux, Solaris und MacOS.

Abbildung 1: Aufbau einer HAProxy Umgebung

Installation und Konfiguration

Da es sich um freie Software handelt, kann der Quelltext von HAProxy und auch eine Auswahl bereits übersetzter Varianten von der Homepage des Projektes heruntergeladen werden. Bei vielen Distributionen, wie zum Beispiel Debian und SuSE, ist die Software jedoch bereits inkludiert, sodass sie über die normale Paketverwaltung installiert werden kann.

Die Konfiguration erfolgt hauptsächlich über eine zentrale und sehr übersichtliche Konfigurationsdatei. Diese besteht aus drei Bereichen: den globalen Einstellungen, den Frontend-Definitionen und den Backend-Definitionen.

In dem Abschnitt der globalen Einstellungen („global“ und „defaults“) kann man zum Beispiel verschiedene Timeouts und Tuning-Parameter hinterlegen, aber auch interne Benutzer definieren, die man für die Zugriffssteuerung nutzen kann.

Der Abschnitt „frontend“ stellt sogenannte Listeners zur Verfügung, über die der Software mitgeteilt wird, auf welchen Port gehört werden soll. Auch wird hier festgelegt, welches Backend benutzt werden soll. Über ACL lässt sich für verschiedene Bedingungen ein eigenes Backend auswählen.

Unter „backend“ finden sich schließlich die Ziele, an die die eingehenden Requests weitergeleitet werden können. Hier kann es zur Lastverteilung mehrere Empfänger geben. Eine Verteilung ist anhand verschiedener Algorithmen möglich. So kann man die Requests zum Beispiel im Round-Robin-Verfahren oder an den Server mit den wenigsten Verbindungen verteilen.

Eine sehr einfache Konfiguration sieht zum Beispiel wie folgt aus:

global
    maxconn 256
    daemon

defaults
    mode    http
    timeout connect 10000
    timeout client  100000
    timeout server  100000

frontend http-in
    bind *:80
    default_backend server
	
backend server
    server server1 127.0.0.1:8080 maxconn 32
 

Erweiterung der Konfiguration

Eine solch einfache Konfiguration bringt so noch keine Verbesserung der Ausgangslage, aber sie lässt sich mit wenigen einfachen Schritten so erweitern, dass die Sicherheit, die Performance oder die Verfügbarkeit, je nach Anforderung verbessert wird. Im Folgenden erweitern wir die Konfiguration entsprechend.

Als ersten Schritt sollten wir dafür sorgen, dass sämtliche Anfragen an den Server verschlüsselt werden. Auch wenn keine sensiblen Daten, wie Passwörter oder personenbezogene Informationen, übertragen werden, so zählt eine SSL-Verschlüsselung bei Web-Seiten schon länger zum Standard.

global
 ssl-default-bind-options ssl-min-ver TLSv1.2 prefer-client-ciphers
 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
 ssl-default-bind-ciphers ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES256:ECDH+AES128:!aNULL:!SHA1:!AESCCM
 ssl-default-server-options ssl-min-ver TLSv1.2
 ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
  ssl-default-server-ciphers ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES256:ECDH+AES128:!aNULL:!SHA1:!AESCCM
 ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
 

Im Abschnitt „global“ werden die gültigen Verschlüsselungsverfahren festgelegt, um die Verwendung alter und möglicherweise unsicherer Verfahren zu unterbinden. Das Frontend wird nun an Port 443 gebunden und die Verschlüsselung aktiviert. Das Verzeichnis, welches dabei angegeben wird, enthält die Zertifikate für die Sites, für die der HAProxy der SSL-Endpunkt sein soll. Hier ist darauf zu achten, dass HAProxy das Zertifikat und den dazugehörigen Schlüssel in einer Datei erwartet. Zertifikate kann man sich kostenlos von letsencrypt ausstellen lassen oder bei einem der zahlreichen kommerziellen Anbieter von Zertifikaten bestellen. Damit alle Anfragen über eine verschlüsselte Verbindung laufen, die Nutzer aber weiterhin nicht darüber nachdenken müssen, welches Protokoll sie verwenden müssen, sollte HAProxy auch auf Port 80 hören, aber alle Anfragen, die über diesen Port hereinkommen, an eine gesicherte Verbindung weiterleiten. Dies lässt sich durch Hinzufügen folgenden Frontends bewerkstelligen: 

frontend http-in
 bind *:80
 http-request redirect scheme https code 301
 

Lastverteilung und ein gewisses Maß an Ausfallsicherheit lassen sich dadurch erreichen, dass man zwei oder mehr Server, die den gleichen Dienst anbieten, bereitstellt. Hier bietet HAProxy eine einfache Möglichkeit, die Anfragen auf die beiden Server zu verteilen. Sollte einer der Server ausfallen, so kann HAProxy dies feststellen und die Anfragen nur noch an den funktionstüchtigen Server weiterleiten. So sind nicht nur Ausfälle, sondern auch Wartungsarbeiten ohne Ausfallzeiten des jeweiligen Dienstes möglich. Hierzu erstellt man einfach ein entsprechendes Backend, welches die Anfragen an die Server weiterleitet, die den Dienst zur Verfügung stellen. Dabei hat man verschiedene Möglichkeiten der Verteilung. Die einfachste ist dabei, dass die Anfragen einfach der Reihe nach auf die einzelnen Server des Backends verteilt werden (Round Robin), aber auch eine Gewichtung ist möglich, falls nicht alle Server eines Backends über die gleiche Rechenleistung verfügen. Befinden wir uns in einem gesicherten Netz, so kann HAProxy auch als SSL-Endpunkt dienen, eine weitere Verschlüsselung zwischen den Anwendungsservern ist dann nicht mehr nötig und entlastet somit auch die Anwendungsserver. 

backend web-backend
   balance roundrobin
   server webserver1 192.168.1.1:80 check
   server webserver2 192.168.1.2:80 check
 

Mit dem Parameter „check“ wird zusätzlich noch veranlasst, dass eine einfache Überprüfung der Erreichbarkeit des Zielservers erfolgen soll. Ist der Server nicht erreichbar, so wird er automatisch aus der Verteilung entfernt, ist er wieder erreichbar, so wird er wieder hinzugefügt. Der Endanwender bekommt so nicht von einem Ausfall mit und der Dienst ist nach außen auch bei einem Ausfall eines Servers vollständig funktionsfähig.

Damit haben wir bereits eine vollständige Konfiguration, die die oben genannten Anforderungen erfüllt und dies mit einer äußerst einfachen und übersichtlichen Konfiguration. Darüber hinaus besitzt HAProxy aber noch ein weiteres, sehr mächtiges Werkzeug: die Access Control Listen (ACL).

HAProxy ACL – Steuerung von Zugriffen

Mit ACL ist es möglich, verschiedene Bedingungen zu formulieren, auf die HAProxy reagieren soll. So ist es zum Beispiel möglich, ein bestimmtes Backend auszuwählen oder eine Anfrage komplett zu blocken. Zahlreiche Faktoren können in diese Bedingungen einbezogen werden, darunter Teile der URL der Anfrage, die Adresse des anfragenden Rechners oder welcher User Agent bei der Anfrage genutzt wurde.

Nehmen wir an, dass ein Dienst je nachdem, welche URL der Kunde eingegeben hat, auf einem anderen Server angesprochen werden soll, wo dort landesspezifische Informationen oder die Sprache entsprechend eingestellt sind. Diese Anforderung kann man sehr leicht durch eine passende ACL umsetzen:

frontend https-in
  bind *:443 ssl crt /etc/haproxy/certs/ alpn http/1.1
  acl host_poland hdr_end(host) -i example.pl
  acl host_germany hdr_end(host) -i example.de

  default_backend web-backend-int

backend web-backend-pl
  balance roundrobin
  server webserver1-pl 192.168.1.1:80 check
  server webserver2-pl 192.168.1.2:80 check

backend web-backend-de
  balance roundrobin
  server webserver1-de 192.168.2.1:80 check
  server webserver2-de 192.168.2.2:80 check

backend web-backend-int
  balance roundrobin
  server webserver1-int 192.168.3.1:80 check
  server webserver2-int 192.168.3.2:80 check
 

Neben diesen einfachen ACL lassen sich auch aufwändigere Regeln formulieren und so der Zugriff steuern. 

Fazit

Diese kurze Vorstellung von HAProxy zeigt, wie man schnell und einfach die Qualität von Web-Diensten erhöhen kann. HAProxy stellt eine schnelle und zuverlässige Alternative zu anderen Reverse-Proxies, wie Ngnix und Varnish. Neben seiner einfachen Grundkonfiguration ist auch seine Schnelligkeit und Stabilität hervorzuheben, die HAProxy hauptsächlich dadurch erreicht, dass er sich auf die Funktionen beschränkt, die für eine effiziente Umsetzung seiner Aufgabe notwendig sind.

Da HAProxy eine freie Software ist, kann sie einfach im Vorfeld getestet und evaluiert werden. Für Firmen, die über keine eigene IT verfügen, gibt es einen kommerziellen Anbieter. Bei der Einrichtung sowohl der freien als auch der kommerziellen Version steht Ihnen ORDIX natürlich als zuverlässiger Partner gerne kompetent zur Seite.

Seminarempfehlungen

Principal Consultant bei ORDIX

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Montag, 07. Oktober 2024

Sicherheitscode (Captcha)

×
Informiert bleiben!

Bei Updates im Blog, informieren wir per E-Mail.

Weitere Artikel in der Kategorie