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.
so long
Leetperator
Sehr schön geschrieben. Hilft mir und anderen sicher weiter.
Danke
Wie wird ein nginx abgesichert? Kannst diu mir da villeicht ein paar Tipps geben?
Tutorial dazu kommt später vielleicht einmal, aber ich will nichts versprechen.
Guter Artikel zum Einstieg in nginx.
Eine Frage hab ich noch. Du hast geschrieben
“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.”
Ist es korrekt, dass ich die proxy.conf in die nginx.conf nicht includieren / einbinden muss? Oder ist einfach der Name proxy.conf reserviert?
Okay, hab es selbst gerade gesehen. Per Default steht in der globalen conf:
include /etc/nginx/conf.d/*.conf;
Verbesserungsvorschlag: Vielleicht in dem eben genannten Absatz angeben, dass man aus dem filename.conf ein filename.deactivated oder so macht. Ansonsten wird die filename-deactivated.conf weiterhin angezogen.
Hi
habe mir mal das installiert läuft fast perfekt, habe probleme nun mit meine emails, kann keine empfangen oder senden.
Desweiteren hätte ich mal eine frage wie sich das zusammen setz nun, wo soll der schutz nun sein von DDoS-Schutz, verstehe das nicht so genau wie nun der Proxy schützen sollte in den sinne ?
Würde mich auf eine antwort freuen
cya
daniel
Hi,
nginx kommt z.B. richtig konfiguriert ganz gut mit nicht allzu starken Flooding-Attacken klar. Und da diese Anfragen dann nicht an den eigentlichen Webserver weitergegeben, sondern von nginx gewissermaßen gefiltert werden, kann man damit einen einfachen Schutz einrichten. Aber bei stärkeren Angriffen ist das natürlich wirklungslos.
Hi
was bedeutet richtig konfiguriert ?
ist die config da oben nicht dafür ausgelegt ?
Könntest du eine richtige konfigurierte config zeigen, für leichte ddos attacken ?
lg
daniel
Hi, werde dazu demnächst einen Artikel schreiben.
Ist es nicht geschickter als reinen proxy (ohne eigene Content-Auslieferung) nicht auch eine reine reverse-proxy-Software zu nutzen? (varnish oder pound z.B.)
Toller Blog, tolles Tutorial. Von allen Tutorial die online sind war dieses nach meiner Meinung am einfachsten. Mir wurde sogar Privat bei anderen problemen mit Linux geholfen. Nur zu empfehlen.
Hi,
warum wird nur standard V-Host von Apache(BackEnd) über fe-Server Proxy angesprochen? Als ob statt proxy_pass http://backend.domain.tld/; einfach IP-Adresse des backend-Servers eingetragen ist.
Hallo nochmal ich habe es gelöst, indem ich in der Zeile proxy_set_header Host $host;
$host durch backend.domain.tld ersetzt habe und zwar in/etc/nginx/sites-enabled/000-backend.domain.tld.vhost
so dass es dann folgendermaßen aussieht:
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;
proxy_set_header Host backend.domain.tld;
}
}
Somit kriegt Apache richtige Header.