Apache mit Proxy-Balancer
Wenn man beispielsweise den Webserver "Mongrel" oder "WEBrick" für Ruby on Rails einsetzen möchte, empfiehlt sich die Verwendung eines Proxy-Balancers für HTTP. Doch da in einer Webhosting-Umgebung für den Enterprise-Einsatz meist entweder ein Apache Webserver der Generation 2.0 oder 2.2 verwendet wird, ist je nach Apache-Version mehr oder weniger zu beachten...
Sofern ein Apache Webserver der Version 2.1 oder neuer im Einsatz ist, kann der bereits im Apache vorhandene Proxy-Balancer, welcher als Apache-Modul "mod_proxy_balancer" bereitgestellt wird, verwendet werden. Der vorhandene "mod_proxy_balancer" stellt allerdings bislang nur rudimentäre Balancer-Funktionalitäten zur Verfügung, die aber gerade bei vielen einfacheren und weniger komplexeren Konfigurationen völlig ausreichen. Insbesondere kleine und mittelgroße Ruby on Rails-Projekte lassen sich damit realisieren, da weder Mongrel noch WEBrick multithread-fähig sind.
Beim Apache 2.2 reicht es, das Modul "mod_proxy_balancer" zu laden und die nachfolgend beschriebene Konfiguration zu übernehmen und an die eigenen Bedürfnisse anzupassen:
<Proxy balancer://projekt1>
BalancerMember http://192.168.0.30:80
BalancerMember http://192.168.0.31:80
</Proxy>
ProxyPass / balancer://projekt1/
Anschließend muss der Apache neugestartet werden, um die Konfiguration zu aktivieren. Benutzer einer älteren Version des SuSE Linux Enterprise Servers verwenden statt "service httpd restart" am besten "rcapache2 restart", um den Apache Webserver neu zu starten.
tux:~ # service httpd restart httpd beenden: [ OK ] httpd starten: [ OK ] tux:~ #
Ist allerdings ein Apache Webserver mit der Version 2.0 oder älter im Einsatz (also auch der Apache 1.3), wie er zur Zeit noch von verschiedenen Linux-Distributionen, die für den Unternehmenseinsatz optimiert sind, ausgeliefert und unterstützt wird, so empfiehlt sich die Verwendung eines alternativen Proxy-Balancers. Auch wenn einige Administratoren schon die Anstrengung unternommen haben, "mod_proxy_balancer" von Apache 2.2 auf Apache 2.0 zu portieren, so funktioniert dies nicht. Man kann zwar das Apache-Modul mit einigem Aufwand fehlerfrei durchkompilieren, aber spätestens bei der Benutzung endet man mit vielen Speicherzugriffsfehlern.
Eine sehr gute und leistungsfähige Alternative dazu ist der HAProxy. Dieser ist zwar kein Apache-Modul, sondern ein eigenständiger Dienst, aber er leistet das gleiche und vieles mehr. Dafür ist die Installation und Konfiguration nicht so trivial wie beim obigen Beispiel. Bei einer aktuellen Version der Linux-Distribution Fedora bzw. bei Red Hat Enterprise Linux 4 und 5 bzw. CentOS 4 und 5 oder einer anderen auf Fedora basierenden Distribution funktioniert die Installation jedoch mittels yum relativ einfach. Allerdings muss bei RHEL bzw. CentOS das Repository EPEL in yum eingebunden und aktiviert sein:
tux:~ # yum install -y haproxy
Nach der Installation sollte die Konfigurationsdatei "/etc/haproxy/haproxy.cfg" angepasst werden und ungefähr nachfolgendes enthalten. Diese Konfiguration entspricht in etwa der obigen für den Proxy-Balancer des Apache Webservers 2.2. Da ich hier von einem nicht multithread-fähigen HTTP-Server als Ziel ausgehe, ist die Anzahl der Verbindungen pro Ziel-IP-Adresse auf jeweils eine parallele Anfrage beschränkt.
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 chroot /var/lib/haproxy user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 redispatch maxconn 500 contimeout 5000 clitimeout 15000 srvtimeout 15000 listen projekt1 192.168.0.1:80 balance roundrobin server webserver1 192.168.0.30:80 maxconn 1 check server webserver2 192.168.0.31:80 maxconn 1 check
Anschließend muss man den Dienst nun aktivieren, damit dieser auch nach dem nächsten Neustart der Server wieder mitgestartet wird:
tux:~ # chkconfig haproxy on tux:~ #
Und um nicht bis zum nächsten Neustart warten zu müssen, aktiviert man den HAProxy am besten sofort auf dem Server:
tux:~ # service haproxy start
haproxy starten: [ OK ]
tux:~ #
Benutzer einer älteren Version des SuSE Linux Enterprise Servers verwenden statt "service haproxy start" am besten "/etc/init.d/haproxy start", um den HAProxy zu starten.
Wenn Sie nun die IP-Adresse des Proxy-Balancers bzw. des Proxy-Servers in Ihren Webbrowser eingeben und diese aufrufen, so wird Ihre Anfrage nun von dem Proxy-Balancer, egal ob Apache oder HAProxy, an eine der sich dahinter befindenden HTTP-Instanzen weitergeleitet, also beispielsweise an Mongrel oder WEBrick. Erreicht aber der Proxy-Balancer die dahinterliegenden HTTP-Dienste nicht, weil diese z.B. entweder überlastet sind oder gar nicht gestartet wurden, so liefert dieser meist den HTTP-Fehler 500 mit der Meldung "Bad Gateway" zurück. Hier bietet es sich dann an, eine eigene Fehlerseite auszuliefern, die dem Benutzer eine freundliche Fehlermeldung im Layout der Webseite zurückliefert.