Einführung
In diesem Lab lernen Sie, Nginx als Reverse-Proxy zu konfigurieren.
Stellen Sie sich einen Reverse-Proxy wie den Empfang eines großen Unternehmens vor. Wenn Sie die Hauptnummer anrufen, sprechen Sie nicht direkt mit dem Geschäftsführer oder dem Support-Team. Sie sprechen mit dem Empfang, der fragt: „Wie kann ich Ihnen helfen?“ und Ihren Anruf anschließend an die richtige Person weiterleitet.
In diesem Szenario gilt:
- Nginx ist der Empfang und lauscht auf Port 80.
- Die Python-App ist das „Support-Team“ und lauscht auf Port 8000.
- Sie sind der Client, der anruft.
Sie richten Nginx so ein, dass Nginx eine Anfrage für /app an einen Python-Server weiterleitet und dessen Antwort an den Client zurückgibt.
Reverse-Proxys sind ein zentraler Bestandteil moderner Webarchitekturen. Sie stehen vor den Anwendungsservern und stellen einen stabilen öffentlichen Einstiegspunkt bereit. Außerdem können sie TLS-Terminierung, Load-Balancing, Caching und das Routing von Anfragen übernehmen.
Das bedeutet: Nginx stellt nicht immer selbst Dateien bereit. Manchmal besteht seine Hauptaufgabe darin, Client-Datenverkehr zu empfangen und an einen dahinterliegenden Dienst weiterzuleiten.
Eine Backend-Anwendung starten
Zuerst benötigen wir einen Dienst, an den Nginx Anfragen weiterleiten kann. Dazu erstellen wir mit Python eine sehr einfache Webanwendung.
Wir legen einen eigenen Ordner an, aus dem unsere Anwendung Dateien bereitstellt.
Erstellen Sie in Ihrem Projektverzeichnis einen Ordner namens app und darin eine einfache HTML-Datei:
mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html
Starten Sie nun den Python-Server. Dieser Befehl weist Python an, als Webserver zu arbeiten, Dateien aus dem aktuellen Verzeichnis bereitzustellen und auf Port 8000 zu lauschen.
Dieser Python-Prozess ist in unserem Beispiel der Backend-Anwendungsserver. Er stellt die eigentlichen Inhalte bereit, während Nginx als öffentlich erreichbarer Einstiegspunkt davorsteht.
Das Zeichen & am Ende startet den Prozess im Hintergrund. So können Sie das Terminal weiterverwenden, während der Server im Hintergrund läuft.
cd ~/project
python3 -m http.server 8000 &
Überprüfen Sie nun, ob der Server korrekt gestartet wurde. Suchen Sie nach einem Prozess, der auf Port 8000 lauscht:
netstat -tuln | grep 8000
Die Ausgabe sollte 0.0.0.0:8000 mit dem Status (LISTEN) enthalten. Das bedeutet, dass unsere „Backend-App“ auf Port 8000 bereit ist, Anfragen entgegenzunehmen.
Den Nginx-Reverse-Proxy konfigurieren
In diesem Schritt ändern Sie die Nginx-Konfigurationsdatei und tragen dort unsere Python-App ein.
Bearbeiten Sie die Standardkonfigurationsdatei mit sudo und dem Texteditor nano.
sudo nano /etc/nginx/sites-enabled/default
Scrollen Sie innerhalb des Blocks server { ... } nach unten. Dort sehen Sie einen vorhandenen Block location / { ... }. Fügen Sie darunter einen neuen Block location /app ein.
Fügen Sie den folgenden Code in die Datei ein. Achten Sie genau auf die geschweiften Klammern { } und das Semikolon ;:
location /app {
proxy_pass http://127.0.0.1:8000;
}
Was bewirkt diese Konfiguration?
location /app: Weist Nginx an, auf Anfragen zu reagieren, die mit/appbeginnen.proxy_pass ...: Funktioniert wie eine Anrufweiterleitung. Nginx erhält die Anweisung: „Wenn eine Anfrage für/appeingeht, leite sie anlocalhost(127.0.0.1) auf Port 8000 weiter.“
Diese Weiterleitung ist das Kernprinzip eines Reverse-Proxys. Der Client spricht mit Nginx, aber Nginx wird stellvertretend für den Benutzer zum Client des Backend-Servers.
Ihre Dateistruktur sollte ungefähr so aussehen:
server {
listen 80 default_server;
...
location / {
try_files $uri $uri/ =404;
}
location /app {
proxy_pass http://127.0.0.1:8000;
}
}
Drücken Sie Ctrl+O und anschließend Enter, um die Datei zu speichern. Drücken Sie danach Ctrl+X, um nano zu beenden.
Konfiguration prüfen und Nginx neu laden
Wir haben die Konfigurationsdatei aktualisiert, aber Nginx verwendet weiterhin die alten Regeln. Deshalb müssen wir den Dienst neu laden.
Testen Sie Ihre Konfiguration immer auf Tippfehler, bevor Sie Nginx neu laden. Wenn Sie eine fehlerhafte Konfiguration laden, funktioniert der Webserver möglicherweise überhaupt nicht mehr.
Führen Sie den Testbefehl aus:
sudo nginx -t
Sie sollten Folgendes sehen:
syntax is oktest is successful
Wenn der Test erfolgreich ist, laden Sie Nginx neu, damit die Änderungen übernommen werden:
sudo service nginx reload
Nginx verwendet nun die aktualisierten Anweisungen und ist bereit, Anfragen weiterzuleiten.
Nginx arbeitet an dieser Stelle als Router zwischen URLs und Backend-Diensten und nicht nur als Dateiserver, der Dateien von der Festplatte liest.
Den Proxy testen
In diesem letzten Schritt überprüfen wir, ob unser „Empfang“ seine Aufgabe korrekt erfüllt.
Wir senden eine Webanfrage an Nginx auf Port 80 und fordern /app/ an. Nginx sollte diese Anfrage sofort an den Python-Server auf Port 8000 weiterleiten.
Führen Sie den folgenden Befehl aus:
curl http://localhost/app/
Sie sollten die Nachricht unseres Backend-Servers sehen:
Hello from the Python Backend.
Was ist gerade passiert?
- Sie haben Nginx (
localhost:80) nach/app/gefragt. - Nginx hat seine Regeln geprüft,
/appgefunden und die Anweisungproxy_passbefolgt. - Nginx hat den Python-Server auf Port 8000 kontaktiert.
- Der Python-Server hat die „Hello...“-Seite an Nginx zurückgegeben.
- Nginx hat die „Hello...“-Seite an Sie zurückgegeben.
Diese Anforderungskette sollten Sie sich merken, da sie in moderner Infrastruktur überall vorkommt:
Browser -> Reverse-Proxy -> Anwendungsserver -> Reverse-Proxy -> Browser.
Sie haben erfolgreich einen Reverse-Proxy eingerichtet!
Zusammenfassung
In diesem Lab haben Sie Nginx erfolgreich als Reverse-Proxy konfiguriert. Sie haben gelernt:
- Eine einfache Backend-Anwendung mit Python zu betreiben.
- Nginx mithilfe eines
location-Blocks für das Routing zu konfigurieren. - Datenverkehr mit der Direktive
proxy_passweiterzuleiten. - Die Proxy-Kette mit
curlzu überprüfen.
Diese Architektur bildet das Rückgrat moderner Webanwendungen. Sie ermöglicht es Ihnen, Nginx für Sicherheit und Load-Balancing einzusetzen, während andere Anwendungen die Geschäftslogik im Hintergrund verarbeiten.



