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...

Proxy-Balancer für HTTP, welcher die Anfragen an zwei nachgelagerte HTTP-Instanzen weiterleitet, die z.B. einzeln nicht multithread-fähig sindSofern 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.