Debian 9 : Apache 2.4 Load Balancer für statischen Inhalt

Einen Load Balancer auf Basis von Apache 2.4 für statischen Inhalt aufzubauen ist kein Hexenwerk. Für dynamische Inhalte sieht das etwas anders aus ;-) aber wir fangen erstmal klein an. Wenn ihr auch den Artikel "Debian 9 : Gateway mit DNS und DHCP" druchgespielt habt sieht euer Netz wenn ihr fertig seit so aus.
Topologie Testaufbau
Auf die beiden Server web-01 und web-02 gehe ich nicht weiter ein, das sind Standard Installationen Debian 9 mit Apache

erstmal brauchen wir auf dem Server web-lb der das Apache Loadbalancing übernehmen soll natürlich Apache. das übernimmt dieser Befehl unter root.
apt update && apt install apache2
danach müssen wir noch die benötigten Module aktivieren
a2enmod proxy_balancer proxy lbmethod_* headers status
wie man hier sieht aktiviere ich immer gleich alle lbmethod_* für den Balancer.
Nun folgt ein Neustart des Apache Servers
systemctl restart apache2.service
Nun müssen wir die site für den Balancer konfigurieren. Das erledigen wir in vi mit dem Befehl
vi /etc/apache2/sites-available/balancer.conf
Hier ist meine Beispiel Konfiguration, ich hab hier absichtlich nur eine simple Grundkonfiguration erstellt.
[VirtualHost *:80]
        ServerAdmin webmaster@localhost
        Header add X-Balancer "%{BALANCER_WORKER_NAME}e"
        [Proxy balancer://webintern]
                BalancerMember http://172.16.0.20:80
                BalancerMember http://172.16.0.21:80
                ProxySet lbmethod=byrequests
        [/Proxy]
        ProxyPass "/balancer-manager" !
        ProxyPass "/" "balancer://webintern/"
        ProxyPassReverse "/" "balancer://webintern"
        [Location "/balancer-manager"]
                SetHandler balancer-manager
                Require ip 192.168.2
        [/Location]
        ErrorLog ${APACHE_LOG_DIR}/balancer_error.log
        CustomLog ${APACHE_LOG_DIR}/balancer_access.log combined
[/VirtualHost]
Syntax Highlighting versagt hier leider [ = < und ] = >

Jetzt müssen wir die Site noch aktivieren das erledigt a2ensite für uns.
a2ensite balancer
und noch ein Neustart des Apache Servers
systemctl restart apache2.service
Zur Erklärung :
Header add X-Balancer "%{BALANCER_WORKER_NAME}e"
dient nur dem debuggen und kann nach erfolgreichen einrichten auskommentiert werden. Wenn alles eingerichtet ist und euer Loadbalancer steht bekommt ihr bei jedem Request einen Eintrag im Header mit dem Namen X-Balancer der verifiziert von welchem Server ihr die Antwort erhalten habt.

Balancer Header 01

Das funktioniert solange ihr keine Sessions oder dynamischen Content habt. Wenn ihr das benötigt muss man dafür Sorgen das der Client der den Loadbalancer anfragt auch immer auf dem selben Webserver raus kommt. Ist klar sonst sind die Sessions ja nicht mehr gültig ;-)

Apache Dokumentation zum Modul proxy_balancer

Apache 2.4 - Unterverzeichnis auf anderen Server umleiten mit mod_proxy

Problem : Wenn man mehrere Anwendungen hat die nur über Port 80 kommunizieren, aber alle über eine Leitung verfügbar sein müssen, kann man dies mit dem Apache Modul mod_proxy realisieren. Dieses Modul fungiert als proxy und leitet eine Anfrage intern an einen anderen Server um.

Wenn man sich diese schematische Zeichnung anschaut sieht man besser was gemeint ist.

mod_proxy - Apache 2.4
rot = physische Netzwerkverbindung


Lösung :
Diese Anleitung wurde unter Debian Jessie erstellt. Bei anderen Linux-Distributionen sollte das vorgehen ähnlich sein.
Zum Anfang stellen wir sicher das alle Module installiert sind die wir benötigen, das können wir mit dem folgenden Befehl bewirken.
apache2ctl -M
im output sollten dann diese Einträge vorhanden sein :
.....
 proxy_module (shared)
 proxy_html_module (shared)
 proxy_http_module (shared)
.....
 remoteip_module (shared)
 xml2enc_module (shared)
vermutlich sind diese Einträge nicht vorhanden wenn es sich um ein frisch installiertes System handelt. Dann müssen wir die Library nachinstallieren.
Dazu geben wir den Befehl
apt-get install libapache2-mod-proxy-html
ein. Dann aktivieren wir die Module mit
a2enmod proxy proxy_html proxy_http xml2enc remoteip
nach einem Neustart des Apache Servers stehen diese Module zur Verfügung
service apache2 restart

Nun müssen wir uns um die Weiterleitung kümmern. Diese erledigen wir in der Konfiguration der virtual Host auf dem Apache.
Ich verwende hier die Default Konfiguration für die Anleitung.
 nano /etc/apache2/sites-available/000-default.conf
öffnet den Editor dort fügen wir nun unsere Umleitung ein.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html 
RemoteIPHeader X-Forwarded-For

# Weiterleiten auf site1.int.test
    ProxyPass /site1/ http://site1.int.test/
    ProxyPassMatch ^/site1/(.*) http://apache.proxy.ext.test/site1/$1
    ProxyPassReverse /site1/ http://site1.int.test/
	ProxyHTMLURLMap http://site1.int.test /site1/
# Weiterleiten auf site2.int.test
    ProxyPass /site2/ http://site2.int.test/
    ProxyPassMatch ^/site2/(.*) http://apache.proxy.ext.test/site2/$1
    ProxyPassReverse /site2/ http://site2.int.test/
	ProxyHTMLURLMap http://site2.int.test /site2/
		
# LogFiles

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Nachdem wir die Datei gespeichert haben überprüfen wir die Konfiguration mit dem Befehl
apache2ctl configtest
lautet der Output
Syntax OK
haben wir alles richtig gemacht. Jetzt starten wir noch den Apache Server durch damit die Konfiguration aktiv wird.
service apache2 restart


Quellen :
apache.org - Doku - proxypass
apache.org - Doku - proxypassmatch
apache.org - Doku - proxypassreverse
apache.org - Doku - proxyhtmlurlmap
apache ProxyPass: how to preserve original IP address
“Das Alzheimer-Gesetz der Programmierung: Wenn du einen von dir vor zwei Wochen geschriebenen Code ansiehst, kommt es dir vor als hättest du ihn noch nie gesehen.”
Dan Hurvitz – Software-Entwickler