Konfiguration eines Apache Load Balancer

Nun ist es endlich soweit, wir wollen einen Apache Load Balancer konfigurieren. Die Planungen für unser Web sind abgeschlossen (Planungen zum Aufbau für einen Apache Load Balancer). Ohne hier noch einmal auf die MySQL Replikation eingehen zu wollen, stellt sich die Systemkonfiguration wie folgt da:

Server 1: DNS, NS, Load-Balancer
Server 2: cl1.domain.de
Server 3: cl2.domain.de

Wir erreichen also über domain.de Server 1 und wollen die Anfrage per Load Balancer auf einen der beiden Web-Frontend-Server (cl1 und cl2) routen.

Apache-Module aktivieren
Wir benötigen auf unseren Frontend-Server nur das Modul „mod_rewrite“. Per Putty verbinden wir uns als Root auf die Server und aktivieren das Modul:

a2enmod rewrite

Danach starten wir den Apachen neu:
/etc/init.d/apache2 force-reload

Aktuell benötigen wir keine Session serverübergreifend, da wir programmseitig sichergestellt haben, dass ein User auf einem zugeteilten Server verbleibt (und die Zugriffe nicht über einen längeren erfolgt). Ansonsten sollten wir noch folgende Rewrite-Rule auf jedem Client (mit der richtigen cl-Adresse) hinzufügen:

[…]
RewriteEngine On
RewriteRule .* – [CO=BALANCEID:balancer.cl1:.domain.de]
[…]

Konfiguration des Load-Balancer
Unser Server mit dem Load-Balancer soll unter www.domain.de erreichbar sein. Dies müssen wir per DNS sicherstellen. Ferner benötigen wir die untenstehenden Apache-Module, die wir mit dem Befehl „a2enmod“ aktivieren können.

a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
a2enmod status

Den Apache neu starten
Wie nach jeder Konfiguration müssen wir den Apache-Dienst neu starten:
/etc/init.d/apache2 force-reload

Der Balance-Manager
Eine schöne Geschichte ist der Balance-Manager, den der Apache mitbringt. Dieser ist via http erreichbar. Über ihn können einige Informationen zur Laufzeit abgerufen und eingestellt werden.
Der Balance-Manager benötigt ein nach Möglichkeit passwortgeschütztes Verzeichnis. Per Plesk legt man dieses über die Oberfläche an. Per Konsole gilt der untenstehende Weg:

Anlegen des Verzeichnisses „balance-manager“
mkdir /var/www/balancer-manager

User/Passwort anlagen [USER]= „admin“ oder ähnliches
htpasswd -c /var/.htpasswd [USER]

Nun öffnen wir einen Texteditor
vi /var/www/balancer-manager/.htaccess

Eingabe im Editor
AuthType Basic
AuthName „Members Only“
AuthUserFile /var/.htpasswd
<limit GET PUT POST>
require valid-user
</limit>

So, nachdem nun die Vorbereitungen für den Balance-Manager abgeschlossen wurden, kommen wir zur eigentlichen Konfiguration. Diese findet in der Datei „vhost.conf“ (unter Plesk in „/var/www/vhost/domain.de/conf/“) statt.

Debian-Installationen gehen so vor:

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default_orig
cat /dev/null > /etc/apache2/sites-available/default
vi /etc/apache2/sites-available/default

Hinzufügen in der Config-Datei
Achtung, beachten Sie die „/“! Dies ist meist eine Fehlerquelle.
Hinweis für Plesk-Nutzer: In die vhost.conf gehört nur der Teil ab (inklusive) „ProxyRequests Off“ bis „</Location>“ (inklusive).

NameVirtualHost *
<VirtualHost *>
        ServerName www.domain.de
        ServerAlias domain.de
        DocumentRoot /var/www/
        ProxyRequests Off

        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>

        ProxyPass /balancer-manager !
        ProxyPass / balancer://mycluster/ stickysession=BALANCEID nofailover=On
        ProxyPassReverse / http://cl1.domain.de/
        ProxyPassReverse / http://cl2.domain.de/
        <Proxy balancer://mycluster>
          BalancerMember http://cl1.domain.de  route=cl1
          BalancerMember http://cl2.domain.de  route=cl2
          ProxySet lbmethod=byrequests
        </Proxy>

        <Location /balancer-manager>
          SetHandler balancer-manager

          Order deny,allow
          Allow from all
        </Location>
</VirtualHost>

Zur Erklärung:

ProxyPass /balancer-manager !
Verzeichnisse, die hier mit „ProxyPass“ und „!“ angegeben sind, werden vom Load-Balancer ausgenommen; sie werden also lokal aufgerufen. Wenn Web-Statistiken wie Webalizer oder AWStats aktiviert sind, sollte dieses Verzeichnis ebenfalls hier aufgeführt werden.

ProxyPass / balancer://mycluster/ stickysession=BALANCEID
Wenn Cookies/Sessions serverübergreifend gelten sollen, muss hier die BALANCEID mit der Rewrite-Rule auf den einzelnen Frontend-Servern übereinstimmen.

ProxyPassReverse / http://cl2.domain.de/
Hier werden die einzelnen Frontend-Server aufgeführt. Auch wenn das System produktiv ist, kann hier jederzeit ein Server hinzu- oder weggenommen werden.

Apache-Dienst neu starten
/etc/init.d/apache2 force-reload

Hinweis für Plesk-Nutzer
Die Datei vhost.conf ist eventuell nicht vorhanden. Diese kann per Texteditor angelegt werden. Jedoch muss explizit nach jeder Änderung an der Datei der untenstehende Befehl ausgeführt werden, damit die Änderungen in der vhost.conf auch in die globale Apache-Conf übernommen wird.
/usr/local/psa/admin/sbin/websrvmng –reconfigure-vhost –vhost-name=[VHOST-NAME]

Weitere Konfigurationsmöglichkeiten
Dem BalanceMember können noch weitere Werte wie beispielsweise
BalancerMember http://:8080 min=10 max=50 loadfactor=2
BalancerMember http://:8080 min=5 max=25 loadfactor=1
mitgegeben werden.

Loadfactor: Dieser bestimmt die Gewichtung eines Balancer-Mitglieds. Wenn dieser nicht angegeben wird oder für alle Member gleich ist (zum Beispiel je 50), dann bedeutet dies, dass der Balancer jedem Frontend gleich viele User zuteilt. Wenn ich einem Mitglied eine geringere Zahl als einem anderen Frontend zuteile, wird dieser Server mit weniger User belastet.

Status: Status eines Balancer-Mitglieds
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

2 Gedanken zu „Konfiguration eines Apache Load Balancer“

  1. Hallo,

    also ich bin gerade dabei einen Loadbalancer einzurichten und mir liegt der Umgang mit PHP besser als mit Linux und muss sagen das ich mich ja immer sehr freue über solche Anleitungen.

    Aber gleich am Anfang stellt sich mir die Frage bzgl. der Serverübergreifende-Session wo der angegebene Befehl hin soll? Denn das wird dort nicht wirklich erläutert, ich gehe mal davon aus das jeder Client dann eine .htaccess Datei benötigt und dort oben genannter Befehl eingefügt werden muss und der „Server 1: DNS, NS, Load-Balancer“ keine zusätzliche Anweisung erhält bzgl. der Serverübergreifende-Session?

    Und wie sieht es in Verbindung mit Memcache(d) aus? Benötigt man hier die Änderungen noch?
    Ich denke da wird Memcache(d) die Aufgabe übernehmen die Sessions zu händeln und am Balancer wird man da wohl nirgendwo etwas anpassen müssen oder? Wie kann man das Testen wenn es via Memcache läuft?

    MFG: Stefan

    Antworten
  2. Einen kleinen Nachtrag habe ich noch…
    Was ich auch sehr undurchsichtig finde ist die Geschichte mit dem „Balance-Manager“, der Ordner der dafür vorgesehen ist, soll doch sicherlich in den www Ordner der jeweiligen Domain, damit dieser dann auch via domain.de/Balance-Manager erreichbar ist oder nicht?

    Was ebenfalls für mehr Verwirrung als alles andere sorgt ist die Information das in Plesk dies über die Adminoberfläche zu erledigen ist, hier mit ist dann wohl schlichtweg ein normaler Ordner in der jeweiligen Domain gemeint (welche dann wie eben schon vermutet ja einfach im Weberreichbaren bereich ist oder sollte man ihn außerhalb erstellen) ???
    Oder bietet Plesk da gar eine Funktion für Loadbalancer die nun durch vorherige Befehle freigegeben wurde und nun iwo angezeigt wird?

    Und noch nen letzter Punkt =)
    Der Ordnername ist ja in der vhost.conf enthalten, und könnte man so abändern oder?

    ProxyPass unterordner/srv_stats !

    SetHandler balancer-manager

    Order deny,allow
    Allow from all

    MFG: Stefan

    Antworten

Schreibe einen Kommentar