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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Reverse-Proxy | ein Server, der Anfragen an die Anwendung dahinter weiterreicht | |
| Upstream | die Anwendung, an die ein Proxy Anfragen weiterreicht | |
| Lastverteilung | Anfragen auf mehrere Server verteilen | |
| 502 | der Status, der sagt, dass der Proxy von der Anwendung keine Antwort bekam | Bad Gateway |
| X-Forwarded-For | ein Header, der die Adresse des echten Besuchers trägt | |
| Reload | einen 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
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
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
docker exec web nginx -tHier 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
docker exec web nginx -s reloadHier 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
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
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
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.conf | Was 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-Zeile | Den 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
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
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
docker logs web 2>&1 | grep -F "Connection refused" | tail -n 1Hier 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
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
for i in 1 2 3 4; do curl -s http://web:8080/; doneHier 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
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.