Reverse-Proxy einrichten

LinuxBeginner
Jetzt üben

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 /app beginnen.
  • proxy_pass ...: Funktioniert wie eine Anrufweiterleitung. Nginx erhält die Anweisung: „Wenn eine Anfrage für /app eingeht, leite sie an localhost (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 ok
test 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?

  1. Sie haben Nginx (localhost:80) nach /app/ gefragt.
  2. Nginx hat seine Regeln geprüft, /app gefunden und die Anweisung proxy_pass befolgt.
  3. Nginx hat den Python-Server auf Port 8000 kontaktiert.
  4. Der Python-Server hat die „Hello...“-Seite an Nginx zurückgegeben.
  5. 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:

  1. Eine einfache Backend-Anwendung mit Python zu betreiben.
  2. Nginx mithilfe eines location-Blocks für das Routing zu konfigurieren.
  3. Datenverkehr mit der Direktive proxy_pass weiterzuleiten.
  4. Die Proxy-Kette mit curl zu ü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.