Apache Proxy

Aus Wiki
Wechseln zu: Navigation, Suche

Heute kann es vorkommen, dass man verschiedene Webservices anbieten, die mit unterschiedlichen Scripting Engines (PHP, Python, Ruby, Javascript) arbeiten. Hier kann man schnell ein Dilemma geraten: Wird ein solcher Host ausgetauscht, müssen wieder alle Komponenten zusammen spielen.

Gerade Scriptsprachen teilen ihre Features auf viele kleine Module auf, was die Administration nicht gerade erleichtert. Es ist oft alles andere als einfach auf alle Abhänigkeite acht zu geben. Schnell gerät man in eine Zwickmühle: Die eine Scriptsprache erfordert eine Version einer Bibliothek, die andere eine andere.

Ansatz

Einfacher ist hier der Weg einzelner VMs. Jede Scriptsprache läuft auf einer eigenen Maschine – „davor“ steht eine „blöde“ Apache-Instanz, die nichts anderes macht, als die Anfragen an die jeweilige Maschine weiterzureichen.

                                 .--------.
                         .-----> | PHP    |
              .-------. /        '--------'
              |       |          .--------.
 Request ===> | Proxy | -------> | Python |
              |       |          '--------'
              '-------' \        .--------.
                         '-----> | Ruby   |
                                 '--------'

Installation

sudo apt-get install libapache2-mod-proxy-html
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http

[1]

Proxy Server

Konfiguration

Die Konfiguration muss für jeden Virtual Host einzeln vorgenommen werden.

Proxy Server

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName example.com
  ProxyPass          /  http://internal.server/
  ProxyPassReverse   /  http://internal.server/
  ProxyPreserveHost  On
</VirtualHost>


Erklärung
ServerAdmin E-Mail-Adresse des Admins
ServerName Der Browser fordert die Adresse example.com
ProxyPass Der Request wird an den Server internal.server weitergeleitet.
ProxyPassReverse Auch untergeordnete Ziele werden an internal.server weitergeleitet.
ProxyPreserveHost Sorgt dafür, dass das Header-Feld Host nicht auf internal.server umgeschrieben wird.

Interner Server

Mit obiger Einstellung funktioniert eigentlich alles bereits. Allerdings sieht es für den internen Server jetzt so aus, als ob der Proxy-Server die Anfragen macht. Er ersetzt die eigentliche IP-Adresse durch seine eigene. Das ist nicht immer erwünscht – nach außen sollte nicht erkennbar sein, dass es sich um ein ganzes Gespann von Servern handelt.

Glücklicherweise stellt der Proxyserver die Informationen einfach im Feld X-Forwarded-For zur Verfügung. Die meisten Webskripte wissen davon aber nichts, daher muss der Ziel-Server den Header wieder umschreiben. mod_remoteip erledigt das:

sudo a2enmod remoteip
service apache2 restart

Anschließend muss die Option noch entsprechend aktiviert werden:

<VirtualHost *:80>
  RemoteIPHeader X-Forwarded-For
</VirtualHost>

[2]

Referenzen

  1. Aktivieren der notwendigen Module
  2. redirect - apache ProxyPass: how to preserve original IP address - Stack Overflow: