Konfiguration

Die in Listing 1 abgedruckte Beispielkonfiguration zeigt die grundlegenden Einstellungen eines Frontend-Servers; sie könnte so zum Beispiel einen virtuellen Host erweitern.

Listing 1

Beispielkonfiguration

ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
ProxyErrorOverride On
ProxyTimeout 30
<Proxy balancer://<emphasize class="replaceable">pool1</emphasize>>
  BalancerMember http://<emphasize class="replaceable">server1</emphasize>:8080 \
    min=10 max=50 loadfactor=2
  BalancerMember http://<emphasize class="replaceable">server2</emphasize>:8080 \
    min=5 max=25 loadfactor=1
</Proxy>
ProxyPass /<emphasize class="replaceable">shop</emphasize> balancer://<emphasize class="replaceable">pool1</emphasize> \
  lbmethod=byrequests \
  nofailover=Off maxattempts=3 \
  stickysession=<emphasize class="replaceable">PHPSESSIONID</emphasize>

Zunächst wird der normale Proxy-Modus mittels »ProxyRequests« deaktiviert um einen sogeannten Reverse Proxy, oder korrekterweise Gateway, zu erhalten. Das gleichzeitige Abschalten der Weitergabe der Via-Header mittels »ProxyVia« bewirkt die Unsichtbarkeit des Gateways. Die beiden Anweisungen »ProxyPreserveHost« und »ProxyErrorOverride« stellen zudem sicher, daß die in der Anfrage enthaltenen Host-Header an die Backends weitergereicht werden und, daß etwaige, durch die Backends generierte, Fehlermeldungen durch den Load-Balancer ersetzt und somit vereinheitlicht werden. Die Angabe eines geeigneten Timeouts mittels »ProxyTimeout« rundet die Basis-Konfiguration ab.

Die eigentliche Definition des Herstücks, eines Backend-Pools inklusive seiner Mitglieder, erfolgt hingegen mittels eines »Proxy« Containers und der Angabe des speziellen balancer:// Schemas gefolgt vom Namen des Pools. Die im Container enthaltenen »BalancerMember« Anweisungen sowie ihre Parameter legen hierbei die einzelnen Mitglieder fest und bestimmen auch deren Eigenschaften.

Zum Ende der Konfiguration wird der zuvor definierte Backend-Pool einem eigenen URL-Raum zugewiesen; weitere Parameter bestimmen hierbei die allgemeine Arbeitsweise des Load-Balancers. Um in den Genuss einfacher, regulärer Ausdrücke zu kommen, könnte hier anstatt »ProxyPass« auch einfach die erweiterte »ProxyPassMatch« Anweisung Verwendung finden.

Alternativ steht mit Hilfe des des Rewrite-Moduls (»mod_rewrite« ) und eigens erstellter Regeln natürlich immer auch die volle Leistungsfähigkeit von regulären Ausdrücken zur Verfügung. In diesen Fällen wird jedoch die Verwendung von »ProxySet« notwendig, da per Regel keine Parameter des Load-Balancers beeinflusst werden können:

ProxySet balancer://<emphasize class="replaceable">pool1</emphasize>↩
  lbmethod=bytraffic
...
RewriteEngine On
RewriteRule ^/+(.*)$↩
  balancer://<emphasize class="replaceable">pool1</emphasize>/$1 [P,L]

Im Fall des Beispiels in Listing 1 werden also zwei Backend-Server im Pool pool1 definiert. Die Verteilung der Anfragen wird anhand der Anzahl dieser Anfragen bestimmt (siehe »lbmethod« Parameter), wobei aufgrund der Einstellung des sogenannten "Load Factors", server1 im Vergleich zu server2 immer die doppelte Anzahl an Anfragen erhält. Verbindungen werden wiederverwendet, aber auch auf einen oberen Maximalwert begrenzt. Als URL-Raum wird der komplette Raum unterhalb der URL "/shop" gewählt.

Eine Übersicht über die gebräuchlichsten Parameter der »ProxyPass« und »BalancerMember« Anweisungen findet sich in Tabelle 2. Die Dokumentation des Apache HTTP Servers [2] enthält jedoch eine weit ausführlichere Beschreibung aller Parameter und sollte in jedem Fall konsultiert werden.

Tabelle 2

Die gebräuchlichsten Balancer-Parameter

Name

Erklärung

status

Status eines Balancer-Mitglieds

loadfactor

Normalisierte Gewichtung eines Balancer-Mitglieds

lbset

Dem Balancer-Mitglied zugewiesene Cluster-Set

lbmethod

Vom Balancer zur Anfragen-Verteilung verwendete Methode, entweder anhand der Anzahl (»byrequests« ) oder anhand des Datenaufkommens (»bytraffic« ) der Anfragen

min

Minimale Anzahl ständig offener Backend-Verbindungen

max

Maximale Anzahl ständig offener Backend-Verbindungen

maxattempts

Maximale Anzahl zu tätigender Versuche bevor die Anfrage abgewiesen wird

stickysession

Name eines von den Backend-Server verwendeten, persistenten Cookies

Möglichkeiten

Neben den schon zahlreichen Optionen zur Basis-Konfiguration stellt das Proxy-Modul (»mod_proxy« ) des Apache HTTP Servers eine schier unüberschaubare Fülle an speziellen Einstellungsmögklichkeiten zur Verfügung. Für nahezu jede denkbare Situation wird ein geeignetes Werkzeug angeboten und einer individuellen Ausgestaltung der Balancer-Funktionalität steht somit nichts im Wege.

Mit Hilfe des »status« Parameters ist es zum Beispiel möglich einen sogenannten "Hot Standby Server" zu betreiben:

BalancerMember http://<emphasize class="replaceable">server4</emphasize>:1080↩
  ... status=+H

Hiermit wird erreicht, daß server4 nur im Fall des Versagens der restlichen Pool-Mitglieder zur Verwendung kommt. Er ist also die letzte "Verteidungslinie" und lässt sich im Katastrophenfall zum Beispiel dazu benutzen, um eine eingeschränkte Version der Web-Anwendung auszuliefern oder gar um auf ein Ersatz-System zu verweisen.

Eine weitere, häufig anzutreffende Konfiguration findet sich in der Unterstützung von sogenannten "Sticky Sessions":

BalancerMember http://<emphasize class="replaceable">server6</emphasize>:1080↩
  ... stickysession=JSESSIONID

Der Einsatz des »stickysession« Parameters in Kombination mit dem Namen eines von den Backends unterstützten Cookies bestimmt, daß die von einem einzelnen Besucher ausgehenden Anfragen jeweils zu dem gleichen Backend-Server geleitet werden. Diese Art der limitierten Verteilung stellt zwar die Persistenz der Anfragen sicher, ist aber auch dem eigentlichen Load-Balancing sehr abträglich. Leider ist dies in der Praxis keine Ausnahme.

Um gezielt Informationen an die Backend-Server weiterzugeben oder die Kommunikation mit diesen zu beeinflussen, erlaubt das Proxy-Modul auch die Verwendung von eigens definierten Umgebungsvariablen und HTTP-Headern. So lässt sich einerseits die Verbindung zu den Backends limitieren oder aber zum Beispiel auch die Verwendung von SSL mitteilen:

SetEnv proxy-nokeepalive 1
...
RequestHeader set Front-End-Https "On"

Einige schon definierte Standard-Variablen und -Header wie zum Beispiel »proxy-nokeepalive« , »proxy-sendcl« , »X-Forwarded-For« oder auch »X-Forwarded-Server« , erleichtern die Arbeit und ersparen Tipparbeit.

Übrigens lassen sich alle eigens und auch vordefinierten Variablen als zusätzliche Log-Angaben in gewohnter Manier verwenden: »%{VAR}i« .

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2020