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