Apache2 Reverse Proxy mit Client-IPs

Die Ausgangslage: Ich habe immer wieder mal das Problem, eine Webseite (bzw einen kompletten Virtual Host) auf einen neuen Server umzuziehen. Der häufigste Grund dafür ist eine veraltete Server-Software zu aktualisieren (z.B. von Debian Etch oder Lenny auf Debian Squeeze). In diesen Fällen gehe ich oft so vor, dass ich auf dem neuen Server die gleiche Virtual Host Konfiguration einrichte, wie auf dem Alten. Normalerweise habe ich hier auf beiden Systemen einen Apache2 Webserver, daher sollte das relativ einfach zu übertragen sein. Das hat zum einen den Vorteil, dass ich auf dem Zielsystem gleich testen kann, ob die Webseite noch so funktioniert, wie gewünscht, zum anderen kann ich per Reverse Proxy Konfiguration auf dem alten Server die Webseite schon vom neuen Server holen, obwohl die DNS-Einstellung der Domain noch nicht abgeschlossen ist – und zwar ohne dass der gemeine Webseiten-Besucher davon etwas mitbekommt.

Die Umsetzung: Nachdem ich die Virtual Host Konfiguration übertragen habe und auch die Webseite mit einer alternativen Subdomain (z.B. neu.domain.de) auf dem neuen Server zum Laufen bekommen habe, erweitere ich die Virtual Host Konfiguration des alten Servers um die Proxy-Funktionalität. Dafür benötige ich die Module mod_proxy und mod_proxy_http und folgende Zeilen:

<IfModule proxy_module>
ProxyRequests Off

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

ProxyPass / http://neu.domain.de/
ProxyPassReverse / http://neu.domain.de/

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

Nach einem Apache-Reload sollten Anfragen an den alten Server nun so agieren, dass dieser seinerseits beim neuen Server (über die alternative Subdomain) anfragt. Der liefert dann die angeforderte Seite an den alten Server, der wiederum so tut, als ob die Seite von ihm selbst käme, sodass der Webseiten-Besucher den Unterschied nicht mitbekommt.

Ein Problem könnten wir dennoch haben: die Tatsache, dass der neue Server nun im Apache-Log-File und in der Server Variablen für die Remote-Client-IP (REMOTE_ADDR) nun die IP-Adresse vom alten Server führt. Ausserdem wird die alternative Subdomain als Host-Adresse (SERVER_NAME) verwendet, was unter Umständen ein ungewolltes Verhalten der Web-Applikation auslösen könnte.
Die Lösung dafür ist zum Teil bereits mit der Konfiguration auf dem alten Server umgesetzt worden, da hier das Apache-Modul mod_proxy_http dafür sorgt, dass die beiden fraglichen Server-Variablen als zusätzliche Informationen bei der Anfrage an den neuen Server mitgeschickt werden. Diese Informationen sind beim neuen Server nun unter den Server-Variablen HTTP_X_FORWARDED_FOR und HTTP_X_FORWARDED_HOST verfügbar.

Damit der neue Server diese Daten automatisch in die Variablen REMOTE_ADDR und SERVER_NAME schreibt und somit die richtigen Client-IPs im Logfile stehen bzw der jeweiligen Webanwendung zur Verfügung stehen, benötigen wir noch das Apache Modul mod_rpaf, welches wir folgendermassen in der neuen Virtual Host Konfiguration aktivieren:

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 111.222.333.444
</IfModule>

111.222.333.444 ist in unserem Fall die IP des alten Servers. Das bedeutet, dass alle Proxy-Anfragen, die von dieser IP kommen, so behandelt werden, dass die Variablen REMOTE_ADDR und SERVER_NAME mit den gewünschten Daten gefüllt werden.

Somit ist die Webseite nun komplett umgezogen, ohne dass die DNS-Einstellung der zugehörigen Domain geändert werden musste. Falls es stört, dass nun mehrere Adressen auf den selben Webseiten-Inhalt zeigen (Stichwort Duplicate Content), kann man jetzt ohne Gefahr eine ModRewrite-Regel in eine .htaccess-Datei schreiben oder wahlweise auch in die Virtual Host Konfiguration, die alle Anfragen, die nicht von der gewünschten Domain kommen, per HTTP-Code 301 (moved permanently) sofort auf die gewünschte Domain umgeleitet werden. Das sähe dann zum Beispiel so aus:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.domain\.de$ [NC]
RewriteRule ^(.*)$ http://www.domain.de$1 [QSA,L,R=301]
</IfModule>

Wenn nun bei der neuen Virtual Host Konfiguration die richtige Domain bereits vorgesehen wurde (was eigentlich der Fall sein sollte, da ursprünglich die alte Konfiguration direkt übertragen worden ist), dürfte man jetzt beruhigt die Änderung der IP in der DNS-Einstellung der Domain veranlassen. Webseiten-Benutzer sollten dann nämlich von der Umstellung nichts mehr mitbekommen und wir merken das auch nur, da der Traffic auf dem alten Server gegen 0 geht.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>