Der nginx-Server ist nicht nur ein hervorragender Webserver, sondern eignet sich auch sehr gut als Reverse-Proxy vor einem anderen Server. Ein Reverse-Proxy kann z.B. als DDoS-Schutz, zur Lastverteilung oder zum Caching eingesetzt werden. Auch wenn Teile der Netzwerktopologie oder der Serverstandort verschleiert werden, bietet ein Reverse-Proxy eine saubere Lösung.
Im folgenden Tutorial werden wir einen nginx-Server so konfigurieren, dass er als Reverse-Proxy vor einem anderen Webserver agiert.
Der Reverse-Proxy wird dabei vor den “richtigen” Webserver vorgeschaltet und übergibt alle Nutzeranfragen an den Webserver im Hintergrund. Dadurch kommunizieren die Clients nur noch mit dem Proxy und nicht mehr mit dem auslieferenden Webserver. Für die Besucher einer Website bleibt der “Hintergrund-Server” völlig unsichtbar. In unserem Fall verwenden wir wieder ein Debian 6.0-System als Basis und eine “frische” nginx-Installation, an der noch nichts herumkonfiguriert wurde. Erfahrene Admins können natürlich die Proxy-Konfiguration in ihre bestehende nginx-Konfiguration einpflegen.
Im ersten Schritt installieren wir den nginx-Server aus den Debian-Paketquellen:
apt-get install nginx
Anschließend geht es an die Grundkonfiguration des nginx-Servers. Dort definieren wir, dass nginx als Reverse-Proxy agieren soll und legen einige Einstellungen dazu fest. Um die Basis-Konfigurationsdatei nginx.conf nicht unnötig aufzublähen, lagern wir die Proxy-Konfiguration in die Datei /etc/nginx/conf.d/proxy.conf aus, was außerdem den Vorteil hat, dass wir schnell und “sauber” die Proxy-Funktion wieder deaktivieren können, indem wir die proxy.conf einfach umbenennen.
Für den Webserver ist der Reverse-Proxy der aufrufende HTTP-Client, und nicht der Web-Browser des Website-Besuchers. Aus diesem Grund müssen wir dem Zielsystem einige zusätzliche Angaben mitgeben, damit z.B. die IP-Adresse des Besuchers und nicht die IP-Adresse des Proxys an den Webserver übbermittelt wird. Auch einige Standardwerte zu Timeouts und Puffer-Größen sollten noch angegeben werden. Dazu fügen wir in unsere proxy.conf folgende Zeilen ein:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
Im weiteren Verlauf des Tutorials bezeichnet domain.tld den Server, auf dem der Reverse-Proxy läuft. Die Domain backend.domain.tld zeigt in unserem Beispiel auf den internen Server, auf dem der Webserver läuft. Für die Domain domain.tld legen wir nun im Verzeichnis /etc/nginx/sites-enabled/ einen neuen virtuellen Host unter dem Namen domain.tld.conf an.
server { listen 80 default; server_name domain.tld; access_log /var/log/nginx/domain.tld.access.log; location / { proxy_pass http://backend.domain.tld/; proxy_redirect default; } }
Nach einem Neustart des nginx-Servers können wir nun über domain.tld auf den Server unter backend.domain.tld zugreifen. Idealerweise ist der Webserver selbst nicht von außen erreichbar, steht also zusammen mit dem Reverse-Proxy in einem LAN oder verwirft alle Anfragen, die nicht von der IP-Adresse des Proxys kommen. Wie das im Einzelfall funktioniert, entnehmt ihr bitte der Dokumentation zu eurem Webserver.