Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Ein Reverse-Proxy vor einer Anwendung

Nach dieser Lektion: Ich kann nginx vor eine Anwendung setzen und sagen, was die Anwendung sieht.

Lektion, 55 Min.13 BefehleWebserver-Härtungslab: eine schwache nginx-Konfiguration reparieren und mit curl prüfen

Eine Eingangstür für drei Anwendungen

Ein Reverse-Proxy ist ein Server, der vor einer Anwendung steht. Er nimmt die Anfrage jedes Besuchers an und reicht sie weiter. So haben mehrere Anwendungen eine Eingangstür, ein Protokoll und einen Ort, den man schützen muss.

Eine Firma betreibt einen Laden, einen Blog und ein internes Werkzeug. Jedes ist ein kleines Programm auf einem eigenen Port, und keines sollte allein dem Internet gegenüberstehen. Diese Lektion baut die Tür.

Am Ende dieser Lektion

Notiz

Ich kann nginx vor eine Anwendung setzen und sagen, was die Anwendung sieht.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Reverse-Proxyein Server, der Anfragen an die Anwendung dahinter weiterreicht
Upstreamdie Anwendung, an die ein Proxy Anfragen weiterreicht
LastverteilungAnfragen auf mehrere Server verteilen
502der Status, der sagt, dass der Proxy von der Anwendung keine Antwort bekamBad Gateway
X-Forwarded-Forein Header, der die Adresse des echten Besuchers trägt
Reloadeinen laufenden Server seine Einstellungen neu lesen lassen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Reverse-Proxy antwortet für die Anwendung

Ein Besucher spricht mit dem Reverse-Proxy. Der Proxy fragt die Anwendung, den Upstream, und gibt die Antwort zurück. Der Besucher begegnet der Anwendung nie.

Hier besteht die Anwendung aus nginx selbst, auf 127.0.0.1 Port 9000, den nur dieser Rechner erreicht. Der Proxy liegt auf Port 8080. Jeder nimmt eine Datei.

Die Anwendung auf Port 9000 schreiben

Befehl
docker exec web sh -c "printf '%s\n' 'server {' '  listen 127.0.0.1:9000;' '  location / { return 200 \"App-Server: host=\$host weitergeleitet=\$http_x_forwarded_for von=\$remote_addr\n\"; }' '}' > /etc/nginx/conf.d/app.conf"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Proxy auf Port 8080 schreiben

Befehl
docker exec web sh -c "printf '%s\n' 'server {' '  listen 8080;' '  location / {' '    proxy_pass http://127.0.0.1:9000;' '    proxy_set_header Host \$host;' '    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;' '  }' '}' > /etc/nginx/conf.d/proxy.conf"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Einstellungen prüfen, bevor man sie nutzt

Befehl
docker exec web nginx -t

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

nginx die neuen Dateien lesen lassen

Befehl
docker exec web nginx -s reload

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Über den Proxy fragen

Befehl
curl -s http://web:8080/

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Anwendung direkt fragen, ohne den Proxy

Befehl
curl -sS -m 2 http://web:9000/; echo "Exit-Code $?"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Header sagen der Anwendung, wer fragt

Die Anwendung sah den Proxy als Absender. Damit sie weiß, wer wirklich fragte, schreibt der Proxy die Adresse des Besuchers in den Header X-Forwarded-For.

Er reicht auch den Namen weiter, den der Besucher getippt hat, im Header Host. Ohne diese Zeile schickt nginx stattdessen den Namen des Upstreams.

Eine Anfrage mit falschem Absender senden

Befehl
curl -s -H 'X-Forwarded-For: 203.0.113.9' http://web:8080/

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, die erste Adresse in X-Forwarded-For sei immer der echte Besucher. Ein Besucher kann diesen Header selbst schreiben. Vertrauen Sie nur der Adresse, die Ihr eigener Proxy hinzufügte, der letzten in der Liste.

Ein Beispiel: was der Proxy weiterreicht

Zeile in proxy.confWas die Anwendung erfährt
proxy_set_header Host $host;Den Namen, den der Besucher getippt hat, hier web
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;Die Adresse des Besuchers, ans Ende der Liste gesetzt
keine Host-ZeileDen Namen des Upstreams, etwa gruppe

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine ausgefallene Anwendung ergibt ein 502

Antwortet der Upstream nicht, kann der Proxy die Seite nicht holen. Er antwortet 502, Bad Gateway: Der Proxy ist in Ordnung, die Anwendung dahinter nicht.

Zwei Anwendungen hinter einem Namen sind Lastverteilung. nginx gibt ihnen die Anfragen abwechselnd, also kann eine ausfallen, und die andere antwortet weiter.

Den Proxy auf einen toten Port richten

Befehl
docker exec web sh -c "printf '%s\n' 'server {' '  listen 8080;' '  location / { proxy_pass http://127.0.0.1:9009; }' '}' > /etc/nginx/conf.d/proxy.conf && nginx -t && nginx -s reload"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Über den Proxy fragen und den Status lesen

Befehl
curl -s -i http://web:8080/

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Lesen, was nginx über den Fehler schrieb

Befehl
docker logs web 2>&1 | grep -F "Connection refused" | tail -n 1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zwei Anwendungen hinter einen Namen setzen

Befehl
docker exec web sh -c "printf '%s\n' 'upstream gruppe {' '  zone gruppe 64k;' '  server 127.0.0.1:9000;' '  server 127.0.0.1:9001;' '}' 'server {' '  listen 127.0.0.1:9001;' '  location / { return 200 \"zweiter App-Server\n\"; }' '}' > /etc/nginx/conf.d/pool.conf && sed -i 's#127.0.0.1:9009#gruppe#' /etc/nginx/conf.d/proxy.conf && nginx -t && nginx -s reload"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Viermal fragen und die Reihenfolge sehen

Befehl
for i in 1 2 3 4; do curl -s http://web:8080/; done

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die drei Dateien löschen und neu laden

Befehl
docker exec web sh -c "rm -f /etc/nginx/conf.d/app.conf /etc/nginx/conf.d/proxy.conf /etc/nginx/conf.d/pool.conf; nginx -s reload"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zum Weitermachen: die Antwort mit host=gruppe

Sehen Sie sich die vier Antworten noch einmal an. Eine Art von Antwort sagt host=gruppe und nicht host=web.

Welche Zeile der Header-Tabelle erklärt das? Schreiben Sie die eine Zeile, die Sie in den location-Block des Proxys setzen würden, damit die Anwendung wieder host=web sagt.