NGINX Reverse Proxy (+SSL Termination, IP Forwarding & Proxy Caching)

Vorwort

Wie die meisten größeren Firmen nutze auch ich für diese Webseite und weitere Webdienste die ich anbiete einen Reverse Proxy.

Hierbei nutze ich einen nginx. Auf Vor- und Nachteile von nginx gegenüber seinen Konkurrenten gehen wir hier erstmal nicht ein. Ob es das passende Tool für Ihren Anwendungsfall ist, sollte vorher geprüft werden.


Vorbereitung

Als Betriebssysteme verwende ich in diesem Fall ein AlmaLinux 8.5. Die Anleitung kann aber mit kleinen Anpassungen auch auf anderen Linux Systemen angewendet werden.

NGINX installieren:

sudo yum makecache
sudo yum install nginx

Mit folgendem Befehlt lässt sich die Installierte nginx version ausgeben:

nginx -v

In meinem Fall ist die Ausgabe:

nginx version: nginx/1.14.1

Reverse Proxy

Hierfür legen wir eine neue Konfigurationsdatei „root.conf“ im Standard „include“ Verzeichnis an:

sudo nano /etc/nginx/conf.d/root.conf

Hier müssen wir jetzt folgende Konfiguration vornehmen:

server {
     listen 80;
     server_name sleepeehead.club;

     location /{
          proxy_pass        http://192.168.43.26/;
     }
}

Hierbei zählt Folgendes:
listen = Hier kann man den Port oder IP:Port eingeben auf den nginx lauscht

server_name = Hier kommt die URL auf die dieser „Server“ antwortet. Man kann mehrere mit einem Leerzeichen trennen.

location = Gibt den Pfad an den der Client anfordert. In dem Beispiel oben gibt „/“ an das es sich um http://sleepehead.club/ handelt.

proxy_pass = gibt das Ziel an, an das die Daten weitergeleitet werden sollen.


SSL Termination

SSL Termination erfordert in nginx die gleiche Konfiguration wie ein einfacher nginx Webserver:

server {
     listen 443 ssl;
     server_name sleepeehead.club;
     ssl_certificate /etc/ssl/certs/pub.pem;
     ssl_certificate_key /etc/ssl/certs/priv.pem;

     location /{
          proxy_pass        http://192.168.43.26/;
     }
}

Hier haben wir jetzt unseren Lauschport auf 443 geändert und nginx mitgeteilt das dieser Server ssl/tls nutzen soll.

ssl_certificate = Gibt den Pfad zum SSL Zertifikat an
ssl_certificate_key = Gibt den Pfad zum SSL privaten Schlüssel an.


IP Forwarding

Damit unser Backend Server weiß von welcher IP-Adresse unser Client zugreift, müssen wir den X-Forwarded-For Header setzen.

server {
     listen 443 ssl;
     server_name sleepeehead.club;
     ssl_certificate /etc/ssl/certs/pub.pem;
     ssl_certificate_key /etc/ssl/certs/priv.pem;

     location /{
          proxy_set_header  Host $host;
          proxy_set_header  X-Real-IP $remote_addr;
          proxy_set_header  X-Forwarded-For $remote_addr;
          proxy_set_header  X-Forwarded-Host $remote_addr;
          proxy_pass        http://192.168.43.26/;
     }
}


 

proxy_set_header = setzt den angegebenen Header für das Backend.

Im Normalfall genügt es X-Forwarded-For zu setzen.
Weitere Infos hierzu: https://distinctplace.com/2014/04/23/story-behind-x-forwarded-for-and-x-real-ip-headers/


Proxy Caching

Der Cache in nginx wird in einem Verzeichnis abgelegt, also müssen wir dieses zuerst anlegen

sudo mkdir /srv/nginx_cache
sudo mkdir /srv/nginx_cache/root/
sudo chown nginx: /srv/nginx_cache/ -R
sudo chmod 700 /srv/nginx_cache -R

Danach muss der cache im nginx server hinterlegt werden


server {
     listen 443 ssl;
     server_name sleepeehead.club;
     ssl_certificate /etc/ssl/certs/pub.pem;
     ssl_certificate_key /etc/ssl/certs/priv.pem;

     proxy_cache_path /srv/nginx_cache/root/ levels=1:2 keys_zone=root_cache:10m max_size=512m inactive=60m use_temp_path=off;


     location /{
          proxy_cache root_cache;
          proxy_set_header  Host $host;
          proxy_set_header  X-Real-IP $remote_addr;
          proxy_set_header  X-Forwarded-For $remote_addr;
          proxy_set_header  X-Forwarded-Host $remote_addr;
          proxy_pass        http://192.168.43.26/;
     }
}

proxy_cache_path = Gibt den Pfad und Größe des Caches an

levels = Das ist die Menge an Unterordnern, die erstellt werden.
Das sollte man basierend auf Dateisystem erhöhen oder eben nicht.

keys_zone = Name der Key Zone und Größe. Ein MB kann ca. 8 Tausend Keys Speichern.

max_size = Maximale Größe des Caches.

inactive = Gibt an wie lange Dateien im Cache behalten werden.

use_temp_path = Gibt an welcher Pfad als temporärer Pfad verwendet werden soll.
Wenn der Wert auf „off“ steht werden diese im gleichen Verzeichnis gespeichert.

proxy_cache = Gibt an welche Key Zone verwendet werden soll.

Siehe: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

Zusätzlich könnte man noch angeben, dass der Cache Control Header ignoriert werden soll:

 proxy_ignore_headers Cache-Control;
 proxy_cache_valid any 60m;

Abschluss

Zum Schluss am besten die Konfiguration einmal validieren

sudo nginx -t

Und dann den nginx einmal neu laden

sudo systemctl reload nginx.service

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert