In diesem zweiten Teil der HAProxy-Serie wollen wir uns mal angucken, wie das Ganze funktioniert. Ich habe dafür auf meinem Proxmox-Server einen Container erstellt, auf dem ein Apache läuft. Der zeigt nur die Standard-Seite an. Es geht also noch nicht darum, hier eine produktionsreife, komplette Einrichtung vorzunehmen. Ich will erstmal mit HAProxy „warm werden“ – wie ich feststellen durfte, ist die Einrichtung nämlich nicht ganz trivial.

Daher zuerst wieder etwas Theorie – und zwar ein paar Begriffe, mit denen HAProxy arbeitet (eine lehrbuchmäßige Definition kann und will ich nicht liefern, es geht lediglich darum, einen Überblick zu erhalten, womit wir arbeiten):

  • Realer Server: Das ist der Server, auf dem der Dienst, den wir bereitstellen wollen, läuft; also der interne Host
  • Backend Pool: Eine Gruppe von Servern, die gleichbehandelt werden sollen. Das geht in Richtung Load Balancing: Ich habe z.B. drei Server, unter denen die Aufrufe aufgeteilt werden sollen.
  • Öffentliche Dienste: Das, was nach außen hin sichtbar gemacht wird.
  • Regeln: Kriterien, die festlegen, wie Anfragen ausgewertet werden sollen.
  • Bedingungen: Eigenschaften, die definieren, was passieren soll, wenn eine Regel greift.

Das klingt erstmal alles kompliziert. Der Ablauf ließe sich in etwa so beschreiben:

  • Wir erstellen einen realen Server und fügen diesem einem Backend Pool hinzu.
  • Wir definieren eine Regel, die greift, wenn ein bestimmter Hostname aufgerufen wird
  • Wir erzeugen eine Bedingung, die den Backend Pool aufruft, wenn die Regel zutrifft
  • Wir erzeugen einen öffentlichen Dienst, der im Internet lauscht und den Backend Pool aufruft, wenn die Regel zutrifft

Das hat es jetzt nicht wirklich einfacher gemacht, aber wir machen das trotzdem mal. (Die Installation des Plugins erspare ich uns an dieser Stelle – wie Plugins installiert werden, habe ich unter anderen in dem DynDNS-Artikel beschrieben; das Plugin, um das es hier geht, heißt „os-haproxy“.)

Los geht’s mit dem Anlegen des realen Servers: In den Einstellungen des Dienstes HAProxy gibt es einen Eintrag „Reale Server“. Ein Klick auf das Plus-Symbol rechts zeigt die Eingabemaske an:

Weiter geht’s mit den Backend Pools (zu finden unter „Virtuelle Dienste“). Auch hier klicken wir wieder auf das Plus-Symbol:

Hier tragen wir unter „Server“ unseren eben erstellten realen Server ein – das Dropdown hilft uns dabei. Die übrigen Einstellungen fassen wir nicht an. Nach dem Speichern wechseln wir auf den Reiter „Regeln & Prüfungen“. Hier legen wir als erstes eine Bedingung an:

Unter „Bedingungstyp“ gibt es eine große Anzahl von Möglichkeiten, wie die Anfrage ausgewertet werden soll – von „Hostname enthält“ über „Hostname beginnt / endet mit“ bis hin zur Möglichkeit, reguläre Ausdrücke zu verwenden, ist alles dabei. Für mein Beispiel genügt „Host treffer“ – ich will, dass diese Bedingung bei einem bestimmten Hostnamen gezündet wird. Welcher das ist, wird in „Hostzeichenkette“ festgelegt.

Nun erstellen wir eine Regel, die die Bedingung mit dem Backend Pool verknüpft:

Im Dropdown von „Bedingungen auswählen“ wird uns die eben erstellte Bedingung angeboten. Unter „Funktion ausführen“ lassen sich diverse Funktionen ausführen – wir wollen hier einen Backend Pool verwenden. Auch der wird uns in dem Dropdown angezeigt.

Jetzt wechseln wir auf den Reiter „Virtuelle Dienste“ und legen einen neuen „Öffentlichen Dienst“ an:

Unter „Hörende Adressen“ tragen wir 0.0.0.0:80 ein – also „Lausche auf Port 80 auf jeder Adresse“. Die restlichen Einstellungen sind erstmal ohne Belang, lediglich unten unter „Regeln auswählen“ tragen wir die Regel, die wir für diesen Dienst erstellt haben, ein.

HAProxy erinnert uns regelmäßig daran, unsere Änderungen auch anzuwenden. Die Zeit dafür ist jetzt gekommen. Falls noch nicht geschehen, sollten wir jetzt unter Einstellungen → Dienst den Haken bei „HAProxy aktivieren“ setzen. Wenn wir das jetzt anwenden und im Browser den Hostnamen aufrufen, den wir unter Bedingungen angegeben haben, wird uns die Standardseite des Apachen angezeigt:

Damit ist dieser Teil abgeschlossen – im nächsten Teil binden wir Let’s Encrypt ein und leiten die Verbindung auf https um.