NGINX Reverseproxy

Hier gibt es Infos zu verschiedenen Konfigurationen

Konfiguration als Proxy

Ein Proxy dient als Mittelsmann zwischen Client und Server. Dies kann in verschiedenen Varianten genutzt werden. Entweder als Forward Proxy oder als Reverse Proxy. Das klingt jetzt erstmal komplizierter als es ist.

Forward Proxy

Ein Forward Proxy ist dem ein oder anderen Nutzer nur als Proxy bekannt. Als Client verbindet man sich mit einem Proxy um seinen IP oder Herkunft zu verschleiern. Bei einem HTTP Request, wird dieser dann vom Client an den Proxy geschickt und dieser schickt ihn an den Zielserver, z.B. einen Webserver. Dadurch denkt der Zielserver, die Anfrage stamme vom Proxy und bekommt gar nicht mit, dass die Anfrage eigentlich von unserem Client stammt.

Reverse Proxy

Ein Reverse Proxy funktioniert, wie der Name vermuten lässt, genau anders herum. Das heißt er verschleiert nicht den Client, sondern den Zielserver. Dazu werden alle Anfragen an den Reverse Proxy geschickt und dieser entscheidet anhand der URL an welcher Server in seinem interen Netz er die Anfrage weiterleitet. Das ergibt Sinn, wenn man die Server innerhalb eines Rechenzentrums schützen möchte, weil man so nur einen Server an das Internet anbinden muss und nicht jeden einzelnen. Außerdem kann man so mehrere Websites auf einer Domain hosten, ohne ständig Portfreigaben durchzuführen, indem man Subdomains nutzt.

Software

Viele der gängigen Webserver können als Proxy konfiguriert werden. Ich selber habe es bereits mit Apache2 und NGINX probiert. Dazu muss die Config des Webservers angepasst werden, damit dieser statt eine HTML-Datei zu präsentieren die Anfrage an eine Interne IP weiterleitet. Außerdem muss der Proxy die Header anpassen, damit der Client denkt die Antwort käme vom Proxy und nicht von einem Server im Hintergrund.

Konfiguration

Config erstellen

Zu Allererste müssen wir eine Config-Datei für den NGINX erstellen. Diese muss unter /etc/nginx/site-available/ angelegt werden. Um die Config zu verwenden, muss sie noch aktiviert werden.

ln -s /etc/nginx/sites-availabel/<yourconfig> /etc/nginx/sites-enabled/<yourconfig>

Danach kann mir systemctl reload nginx der NGXIN mit der neuen Config neugestartet werden.

Reverse Proxy konfigurieren

Im ersten Beispiel wollen wir alle Anfragen auf http://example.de:80 auf unseren internen Server 192.168.0.100 umleiten.

Dazu definieren wir in der Server-Conifg den Port 80 und den server_name. Mit dem Teil location / definieren wir, dass alle URL des Website umgeleitet werden. Das wird noch klarere, sobald wir mehrere Location Befehle verwenden. Der proxy_pass Befehlt sorgt dafür, dass alle Anfragen an die 192.168.0.100 auf Port 80 weiter geleitet werden.

Möchte man anfragen auf https umleiten, muss statt Port 80, Port 443 angegeben werden.

Dadurch, dass der Proxy die Daten vom internen Server lädt und nicht der Browser des Users, kann man auch interne IP-Adressen hinterlegen, die nicht vom Internet erreichbar sind.

server {
    listen 80;
    server_name example.de

    location / {
        proxy_pass http://192.168.0.100:80/;
    }
}

Im nächsten Schritt wollen wir unsere Website in ein Frontend und Backend aufteilen. Das Frontend soll unter http://example.de/ erreichbar sein und das Backend unter http://example.de/api/.

server {
    listen 80;
    server_name example.de

    location / {
        proxy_pass http://192.168.0.100:80/;
    }

    location /api/ {
        proxy_pass http://192.168.0.101:80/;
    }
}

Manchmal hat man bei der Umleitung eines Subdirectory das Problem, dass z.B. die CSS-Dateien nicht geladen werden. Das liegt daran, dass auch wenn example.de/api/ umgeleitet wird, werden die CSS-Dateien weiter unter example.de/css... gesucht. Um das zu beheben gibt es sub_filter.

Diese sub_filter schauen, durch die HTML Dateien, die der Proxy an den Browser schickt und ändert betreffende Stellen ab.

Dafür muss zuerst im Quellcode geschaut werden, an welcher stelle die CSS-Dateien geladen werden.

server {
    listen 80;
    server_name example.de

    location / {
        proxy_pass http://192.168.0.100:80/;
    }

    location /api/ {
        sub_filter_once off;
        sub_filter 'href="/css/' 'href="/api/css/';
        proxy_pass http://192.168.0.101:80/;
    }
}

So werden alle Stellen die auf den Filter 'href="/css/' zutreffen zu 'href="/api/css/' abgeändert. Das ganze geht natürlich auch mit anderen Dateien als CSS.

Durch sub_filter_once off werden alle Treffer und nicht nur der erste ersetzt.

Proxy bei mehren (Sub)Domains

Möchte man mehrere Domains oder Subdomains über den gleichen Proxy verarbeiten, müssen dafür mehrere Config-Dateien angelegt werden. Durch den server_name Directive kann der NGINX unterschieden, welcher Config-File genutzt werden soll.

Troubleshooting

Fehler „413 Request Entity too large“

Um den Fehler zu beheben muss in /etc/nginx/nginx.conf die folgenden Parameter hinzugefügt werden:

client_max_body_size 10000m;
client_body_buffer_size 10000m;

Websites mit PHP

PHP Cache aktivieren.

#in /etc/nginx/nginx.conf

fastcgi_cache_path /etc/nginx-cache levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
#in /etc/nginx/sites-available/your.conf

location ~ [^/]\.php(/|$) {
fastcgi_cache phpcache; # The name of the cache key-zone to use
fastcgi_cache_valid 200 30m; # What to cache: 'Code 200' responses, for 30 minutes
fastcgi_cache_methods GET HEAD; # What to cache: only GET and HEAD requests (not POST)
Kommentare anzeigen

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.