Ein Apache Webserver kann durch wenige Zeilen zusätzlicher Konfiguration als Proxy vor einem anderen Webserver dienen. Das kann man sich z.B. bei Serverumzügen zunutze machen. Solange die neue Server-IP zu einer Domain noch nicht durch das DNS an alle Clients verteilt wurde, kann man die Besucher einfach am alten Server abfangen und den Server anweisen, die Webseiten aber vom neuen Server abzuholen und sie den Besuchern dann zu präsentieren. Der alte Webserver gibt die Dokumente dann nicht mehr direkt an den Besucher aus, sondern ist nur noch die Vermittlungsstelle zwischen dem Benutzer und dem neuen Server.
Für die Proxyfunktionen werden zwei Apache Proxymodule aktiviert:
sudo a2enmod proxy proxy_http
Wenn SSL verwendet werden soll, darf natürlich auch das ssl Modul nicht fehlen.
Ein einfacher Reverse Proxy
Ein einfacher Reverse Proxy sieht z.B. so aus:
<VirtualHost *:80> ServerName domain.tld ServerAlias www.domain.tld ProxyPass / http://new.domain.tld/ ProxyPassReverse / http://new.domain.tld/ </VirtualHost>
Die entscheidende Rolle spielen dabei natürlich die beiden Direktiven „ProxyPass“ und „ProxyPassReverse“, durch die Anfragen an new.domain.tld weitergereicht werden. Von dort wird die Antwort außerdem wieder entgegengenommen und an den Besucher gesendet.
Ähnlich sieht die Konfiguration aus, wenn ein VirtualHost mit SSL-Unterstützung verwendet wird und die Verbindung zum Besucher verschlüsselt stattfinden soll. Eine Standard-SSL-Konfiguration wäre hier noch einzufügen und der Port auf Port 443 zu ändern. (siehe auch unten)
Die Proxy-Variante mit SSL zum Zielserver
Etwas anders sieht es aus, wenn zum Zielserver (also der Adresse nach den ProxyPass Anweisungen) ebenfalls SSL verwendet werden soll. Würde man statt „http“ einfach „https“ schreiben, gäbe es beim Aufruf der Seite einen Fehler 500. Die Anfrage könnte nicht beantwortet werden. Damit auch zum Zielserver verschlüsselt werden kann, muss eine zusätzliche Direktive „SSLProxyEngine“ auf „On“ gesetzt werden. Erst dann kann auch die Verbindung zum (neuen?) Zielserver verschlüsselt stattfinden
<VirtualHost *:443> ServerName domain.tld ServerAlias www.domain.tld SSLProxyEngine On ProxyPass / https://new.domain.tld/ ProxyPassReverse / https://new.domain.tld/ SSLEngine on SSLCertificateFile /etc/myssl/public.pem SSLCertificateKeyFile /etc/myssl/privkey.pem SSLCertificateChainFile /etc/myssl/chain-class2.pem </VirtualHost>
In der obigen Beispielkonfiguration wäre der Datenverkehr sowohl zwischen Besucher und Proxy als auch zwischen Proxy und Zielserver verschlüsselt.
http://blog.markus-mail.com
Lässt sich das in kleinem Stiel nicht auch so lösen?
RewriteEngine On
RewriteRule (.*) http://localhost:$PORT/$1 [P]
Kenne mich da aber nicht aus.
http://misterunknown.de
Moin,
ich habe folgendes Problem: Ich möchte über einen Apache-Proxy eine URL-basierte Rechteverwaltung für Elasticsearch realisieren. Das funktioniert auf URL-Ebene auch problemlos. Leider verwendet Elasticsearch nicht nur URLs sondern auch erweiterte HTTP-Methoden (nicht nur POST/GET, sondern auch PUT, HEAD und DELETE). Wenn ich diese Methoden auf Usergruppenbasis einschränken will, funktioniert das nicht:
# AuthType etc.
Require group admins
In dieser Konstellation sollten nur User, die der Gruppe admins angehören, die Methoden PUT und DELETE nutzen können. Dem ist aber nicht so. Das komische an der Sache: Wenn ich die Methoden mit „Deny from all“ sichere:
# AuthType etc.
Order deny,allow
Deny from all
funktioniert es wie erwartet: Niemand kann diese Methoden nutzen.
Ist dir sowas schon mal untergekommen? Hast du eine Idee woran es liegen kann?
viele Grüße,
Marco
Vielen Dank für die guten Hinweise. Ich habe das nachgebaut. Leider funktioniert es bei mir nicht. Wie sieht denn die zugehörige proxy.conf aus?
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi Gunnar, eine proxy.conf gibt es nicht. Alles benötigte wird in der VirtualHost-Konfigurationsdatei eingestellt.
LG Thomas
http://www.ulrichivens.de
Hallo Thomas,
danke für die Anleitung. Das klappt super mit einer Unterdomain. Ich habe so einen Etherpad in http://foo.domain.de eingebunden.
Kann man den Proxy auch so konfigurieren, dass er auf http://www.domain.de/foo hört? Ich habe eine laufende Domain mit WordPress und würde gerne auf dieser Domain zusätzlich unter http://www.domain.de/foo einen Proxy für einen anderen Server bzw. einen Etherpad laufen lassen.
Gruß
Ulli
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi Ulli, ja, das ist möglich. Da ich schon seit langem nicht mehr mir Apache arbeite und dir aus dem Stegreif keine Config geben kann, linke ich einfach mal auf Stackoverflow ;-) https://stackoverflow.com/questions/6515872/apache-proxying-subdir-to-rails-app (übertragbar auf Etherpad)
LG Thomas
Hallo, ich habe meinen Apache Proxy Server entsprechend Ihrem Blog konfiguriert. Meine Konfiguration funktioniert wie: Client -> 123.123.43.55 (Proxy) -> http://www.example.com. Problem ist vor mir: Wenn ich 123.123.43.55 eingeben, wechselt es automatisch zu http://www.example.com. Client-Anforderung automatisch umgehen mein Proxy-Server. Wie könnte ich das lösen?