Hier erkläre ich, wie man den Apache HTTP Server (Version 2.4) als Loadbalancer für eigene Internet Dienste verwendet und wie man damit HTTPS Unterstützung hinzufügt.
Diese Anleitung passt zu Debian und Ubuntu Linux. Bei anderen Betriebssystemen ist die Vorgehensweise prinzipiell identisch, allerdings könnten die Kommandos zum Neustarten der Dienste anders heißen und die Konfigurationsdateien liegen womöglich in anderen Verzeichnissen.
Begriffe:
Ich gehe davon aus, dass nicht jeder Leser drei Server zur Verfügung hat. Deswegen beginnen wir damit, deinem Computer drei IP-Adressen zu geben. Damit kann er die Aufgaben von drei Servern übernehmen.
Bei Desktop Computern macht man das normalerweise in der Systemsteuerung der grafischen Oberfläche. Bei Servern sind die Netzwerkkarten stattdessen häufig in der Datei /etc/network/interfaces konfiguriert, zum Beispiel so:
# IP-Adresse für den Loadbalancer auto eth0 iface eth0 inet static address 192.168.2.41 netmask 255.255.255.0 gateway 192.168.2.1 # IP-Adresse für Node 1 auto eth0:0 iface eth0:0 inet static address 192.168.2.201 netmask 255.255.255.0 # IP-Adresse für Node 2 auto eth0:1 iface eth0:1 inet static address 192.168.2.202 netmask 255.255.255.0
systemctl restart networking
apt-get install apache2 a2enmod slotmem_shm headers rewrite substitute proxy proxy_balancer proxy_http lbmethod_byrequests ssl systemctl restart apache2
Teste den Apache HTTP Server, indem du folgende URL mit einem Web-Browser aufrufst: http://192.168.2.41:80/index.html. Es erscheint die Standardseite mit dem Titel "Apache2 Debian Default Page".
In einer realen Anwendung würden die Nodes des Clusters spezielle Anwendungsprogramme mit Webinterface ausführen, zum Beispiel in Java oder PHP programmiert. Wir simulieren diese mit zwei einfachen statischen Webseiten. Füge dazu in die Datei /etc/apache2/ports.conf folgende Zeilen ein:
Listen 192.168.2.201:8080 Listen 192.168.2.202:8080
<VirtualHost 192.168.2.201:8080> ServerName node1 DocumentRoot /var/www/node1 LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-node1.log combined ErrorLog ${APACHE_LOG_DIR}/error-node1.log </VirtualHost> <VirtualHost 192.168.2.202:8080> ServerName node2 DocumentRoot /var/www/node2 LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-node2.log combined ErrorLog ${APACHE_LOG_DIR}/error-node2.log </VirtualHost>
<html> <body> Hello Node 1 </body> </html>
<html> <body> Hello Node 2 </body> </html>
a2ensite nodes systemctl restart apache2
Du hast auf deinem Computer nun drei Webserver eingerichtet:
Füge dazu in die Datei /etc/apache2/ports.conf folgende Zeile ein:
Listen 192.168.2.41:8080
<VirtualHost 192.168.2.41:8080> ServerName loadbalancer <Proxy balancer://cluster> BalancerMember http://192.168.2.201:8080 BalancerMember http://192.168.2.202:8080 ProxySet lbmethod=byrequests </Proxy> ProxyPass / balancer://cluster/ ProxyPassReverse / balancer://cluster/ LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-loadbalancer.log combined ErrorLog ${APACHE_LOG_DIR}/error-loadbalancer.log </VirtualHost>
Aktiviere die Änderung mit der Befehlsfolge:
a2ensite loadbalancer systemctl restart apache2
Nun kannst du die URL des Loadbalancers http://192.168.2.41:8080/index.html aufrufen. Lade die Seite durch die Tastenkombination Strg-F5 mehrmals neu. Du wirst sehen, dass die Anfrage manchmal von Node 1 und manchmal von Node 2 beantwortet wird.
Man kann die URL Pfade ausnutzen, um gezielt einzelne Nodes anzusprechen. Füge dazu folgende Zeilen oberhalb von "ProxyPass / balancer://cluster/" ein:
ProxyPass /node1/ http://192.168.2.201:8080/ ProxyPassReverse /node1/ http://192.168.2.201:8080/ ProxyPass /node2/ http://192.168.2.202:8080/ ProxyPassReverse /node2/ http://192.168.2.202:8080/
Man kann auch einzelne Dateien zu anderen Servern umleiten. Zum Beispiel:
ProxyPass /stefan.html http://stefanfrings.de/index.html ProxyPassReverse /stefan.html http://stefanfrings.de/index.html
RequestHeader unset Accept-Encoding FilterDeclare MySubstitute FilterProvider MySubstitute SUBSTITUTE "%{CONTENT_TYPE} =~ m|^text/html|" FilterProvider MySubstitute SUBSTITUTE "%{CONTENT_TYPE} =~ m|^.*/xml|" FilterChain +MySubstitute SubstituteMaxLineLength 10m Substitute "s|Hello|Willkommen bei|n" Substitute "s|Node|Knoten|n" Substitute "s|192.168.2.201:8080|192.168.2.41:8080|n" Substitute "s|192.168.2.202:8080|192.168.2.41:8080|n"
Damit das Substitue Modul den Inhalt der Webseite durchsuchen und modifizieren kann, muss durch "RequestHeader unset Accept-Encoding" eventuell unterstützte Kompression deaktiviert werden. Die Beschränkung auf bestimmte Content-Types (in diesem Fall HTML und XML Dateien) stellt sicher, dass der Apache HTTP Server nicht versucht, Bilder, Videos oder andere Binärdateien zu modifizieren.
Mit SubstituteMaxLineLength legt man die maximale Länge der Zeilen fest, in denen Text ersetzt werden soll. Längere Zeilen werden übergangen. Diesen Parameter gibt es erst ab Apache 2.4.11.
Beispiel mit regulärem Ausdruck:
Substitute "s|(test/.*)\.aspx?|$1.php|"
<VirtualHost 192.168.2.41:8080> ServerName loadbalancer Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy balancer://cluster> BalancerMember http://192.168.2.201:8080 route=1 BalancerMember http://192.168.2.202:8080 route=2 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </Proxy> ProxyPass / balancer://cluster/ ProxyPassReverse / balancer://cluster/ LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-loadbalancer.log combined ErrorLog ${APACHE_LOG_DIR}/error-loadbalancer.log </VirtualHost>
Nach dem Befehl systemctl restart apache2 kannst du es ausprobieren, indem du im Web Browser die URL des Loadbalancers http://192.168.2.41:8080/index.html aufrufst. Lade die Seite durch die Tastenkombination Strg-F5 mehrmals neu, um zu sehen, dass nun stets von der selbe Node antwortet.
Sollte der festgelegte Node ausfallen, erkennt der Apache dies nach einigen Sekunden und wechselt selbstständig auf eine andere Node.
Füge in die Datei /etc/apache2/ports.conf einen Listener für diese Schnittstelle ein:
Listen 192.168.2.41:8443
cd /etc/apache2 mkdir certificate cd certificate openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout test.key -out test.crt
Erstelle eine neue Datei /etc/apache2/sites-available/sslproxy.conf mit folgendem Inhalt:
<VirtualHost 192.168.2.41:8443> ServerName sslproxy <Proxy balancer://cluster> BalancerMember http://192.168.2.201:8080 BalancerMember http://192.168.2.202:8080 ProxySet lbmethod=byrequests </Proxy> SSLProxyEngine on ProxyPass / balancer://cluster/ ProxyPassReverse / balancer://cluster/ SSLEngine on SSLCertificateFile /etc/apache2/certificate/test.crt SSLCertificateKeyFile /etc/apache2/certificate/test.key LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-sslproxy.log combined ErrorLog ${APACHE_LOG_DIR}/error-sslproxy.log </VirtualHost>
a2ensite sslproxy systemctl restart apache2
Teste die Konfiguration indem du im Web Browser die URL https://192.168.2.41:8443/index.html aufrufst. Der Proxy wird die Anfrage wieder an einen der beiden Nodes weiter leiten.
Wenn du das Zertifikat selbst erstellt hast, wird der Browser warnen, dass dieses Zertifikat unsicher sei. Bestätige die Warnung und lege eine Ausnahmeregel an, um die Webseite aufrufen zu können.
Die deutsche Dokumentation des Apache HTTP Servers findest du hier.