Ein Nginx-Reverse-Proxy empfängt Anfragen von Website-Besuchern und leitet sie an einen anderen Server oder eine andere Anwendung weiter. Er wird häufig verwendet, um Anwendungen, die auf Ports wie 3000 laufen, über einen Domainnamen erreichbar zu machen, ohne ihre internen Ports im Internet offenzulegen.
In dieser Anleitung konfigurieren Sie Nginx unter Ubuntu so, dass Anfragen an eine lokale Anwendung weitergeleitet werden. Außerdem verbinden Sie eine Domain und aktivieren HTTPS.
Was ist ein Nginx-Reverse-Proxy?
Ein Reverse-Proxy befindet sich zwischen den Besuchern und Ihrer Backend-Anwendung.
Statt sich direkt mit einer Anwendung auf Port 3000 zu verbinden, stellen Besucher eine Verbindung zu Nginx über die standardmäßigen HTTP- oder HTTPS-Ports her.
Nginx leitet die Anfrage an die Anwendung weiter und gibt deren Antwort zurück.
Der Ablauf einer Anfrage sieht so aus:
Besucher → Nginx → Backend-Anwendung
Diese Konfiguration wird häufig für Node.js-, Python- und andere Webanwendungen verwendet. Sie kann außerdem TLS-Terminierung, Lastverteilung und eine zentrale Verarbeitung von Anfragen ermöglichen.
Voraussetzungen
Bevor Sie beginnen, benötigen Sie:
- Einen Server mit Ubuntu 24.04 LTS und sudo-Zugriff.
- SSH-Zugriff auf Ihren Server.
- Einen Domainnamen, der auf die öffentliche IP-Adresse Ihres Servers verweist.
- Eine Backend-Anwendung, die auf einem lokalen Port Verbindungen entgegennimmt.
In diesem Beispiel verwenden wir Port 3000.
Wenn Sie mit SSH noch nicht vertraut sind, lesen Sie zunächst unseren Leitfaden für Einsteiger zu SSH-Befehlen.

Schritt 1: Nginx unter Ubuntu installieren
Verbinden Sie sich per SSH mit Ihrem Ubuntu-Server.
Aktualisieren Sie den Paketindex und installieren Sie Nginx:
sudo apt update
sudo apt install nginx -y
Prüfen Sie, ob Nginx läuft:
sudo systemctl status nginx
Die Ausgabe sollte active (running) enthalten.
Falls Nginx nicht gestartet ist, führen Sie Folgendes aus:
sudo systemctl enable --now nginx
Sie können auch die öffentliche IP-Adresse Ihres Servers in einem Browser aufrufen. Wenn HTTP-Zugriff erlaubt ist, sollte die standardmäßige Nginx-Willkommensseite erscheinen.
Wenn Sie UFW verwenden, erlauben Sie HTTP- und HTTPS-Datenverkehr:
sudo ufw allow 'Nginx Full'
Prüfen Sie auch die Firewall-Regeln, die Sie bei Ihrem Hosting-Anbieter konfiguriert haben. Deaktivieren Sie die Firewall nicht, um Nginx erreichbar zu machen.
Schritt 2: Eine Backend-Testanwendung starten
Bevor wir den Reverse-Proxy konfigurieren, benötigen wir eine Anwendung, an die Nginx Anfragen weiterleiten kann.
Erstellen Sie für einen einfachen Test ein temporäres Verzeichnis:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
Erstellen Sie eine einfache HTML-Seite:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
Starten Sie nun den integrierten HTTP-Server von Python:
python3 -m http.server 3000 --bind 127.0.0.1
Damit wird Ihre Testseite auf Port 3000 bereitgestellt und ist nur über die lokale Loopback-Adresse erreichbar.
Lassen Sie dieses Terminal geöffnet und starten Sie eine zweite SSH-Sitzung.
Prüfen Sie, ob die Anwendung antwortet:
curl http://127.0.0.1:3000
Die Ausgabe sollte Folgendes enthalten:
<h1>Nginx Reverse Proxy Works!</h1>
Dieser Python-Server dient nur zur Demonstration. Verwenden Sie für eine produktive Anwendung den dafür empfohlenen Anwendungsserver und die empfohlene Konfiguration zur Dienstverwaltung.
Schritt 3: Eine Nginx-Reverse-Proxy-Konfiguration erstellen
Erstellen Sie einen neuen Nginx-Serverblock:
sudo nano /etc/nginx/sites-available/app.example.com
Ersetzen Sie app.example.com durch Ihre tatsächliche Domain.
Fügen Sie die folgende Konfiguration hinzu:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Speichern Sie die Datei.
Die Konfiguration verstehen
listen 80nimmt HTTP-Anfragen entgegen.server_namegibt an, welche Domain Nginx verarbeiten soll.proxy_passleitet Anfragen an die Anwendung auf Port 3000 weiter.proxy_set_headerübermittelt dem Backend nützliche Informationen über die ursprüngliche Anfrage.
Das Backend muss weitergeleitete Header verstehen und sicher verarbeiten. Konfigurieren Sie Anwendungen nur dann so, dass sie diesen Headern vertrauen, wenn die Anfragen über Ihren vertrauenswürdigen Proxy eintreffen.
Schritt 4: Die Konfiguration aktivieren und testen
Aktivieren Sie Ihren neuen Serverblock:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
Wenn der Link bereits vorhanden ist, erstellen Sie ihn nicht erneut.
Prüfen Sie die Konfiguration auf Fehler:
sudo nginx -t
Wenn der Test erfolgreich ist, laden Sie die Nginx-Konfiguration neu:
sudo systemctl reload nginx
Rufen Sie nun Folgendes auf:
http://app.example.com
Wenn der DNS-Eintrag auf den richtigen Server verweist und das Test-Backend noch läuft, sollten Sie Folgendes sehen:
Der Nginx-Reverse-Proxy funktioniert!
Wenn stattdessen die standardmäßige Nginx-Seite erscheint, prüfen Sie die DNS-Einträge Ihrer Domain und die server_name-Konfiguration.
Schritt 5: HTTPS mit Let’s Encrypt aktivieren
Verwenden Sie für eine öffentliche Website HTTPS, statt den Datenverkehr unverschlüsselt zu lassen.
Prüfen Sie zunächst, ob Ihre Domain auf den richtigen Server aufgelöst wird und ob Port 80 für eingehende Verbindungen erreichbar ist. Beides ist für die standardmäßige HTTP-Zertifikatsvalidierung wichtig.
Installieren Sie Certbot über den offiziellen Snap-basierten Weg:
sudo snap install --classic certbot
Falls der Befehl certbot noch nicht verfügbar ist, erstellen Sie den Befehlslink:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
Fordern Sie anschließend ein Zertifikat an:
sudo certbot --nginx -d app.example.com
Folgen Sie den Anweisungen. Certbot kann ein Zertifikat beziehen und Nginx so konfigurieren, dass Ihre Domain über HTTPS erreichbar ist.
Testen Sie danach die Zertifikatserneuerung:
sudo certbot renew --dry-run
Rufen Sie Folgendes auf:
https://app.example.com
Ihre Testanwendung sollte nun über eine verschlüsselte Verbindung geladen werden.
Schritt 6: Ihren Reverse-Proxy überprüfen
Prüfen Sie die HTTPS-Antwort:
curl -I https://app.example.com
Beim Python-Backend aus dem Beispiel zeigt eine HTTP-Antwort mit 200 OK an, dass die Anfrage die Anwendung erfolgreich erreicht hat.
Sie können auch prüfen, welche Prozesse auf Ihrem Server Verbindungen entgegennehmen:
sudo ss -ltnp
Ihre Nginx-Installation sollte auf den konfigurierten öffentlichen HTTP- und HTTPS-Ports Verbindungen entgegennehmen, während das Backend aus dem Beispiel auf 127.0.0.1:3000 Verbindungen entgegennimmt.
Beachten Sie, dass der temporäre Python-Server beendet wird, wenn Sie seine Terminalsitzung schließen. Produktive Anwendungen sollten unter einem Prozessmanager wie systemd laufen.
Häufige Probleme mit Nginx-Reverse-Proxys
502 Bad Gateway
Das bedeutet in der Regel, dass Nginx keine gültige Antwort vom Backend erhalten hat.
Prüfen Sie, ob Ihre Anwendung läuft und ob der Port in proxy_pass korrekt ist.
Unser Leitfaden zur Behebung von 502 Bad Gateway in Nginx behandelt Protokolle, Upstream-Dienste und Verbindungsprobleme ausführlicher.
504 Gateway Timeout
Ein 504-Fehler tritt auf, wenn das Gateway die erforderliche Antwort vom Upstream nicht rechtzeitig erhält.
Untersuchen Sie langsame Anfragen an die Anwendung und die Leistung des Backends, bevor Sie die Zeitlimits erhöhen.
Weitere Anleitungen finden Sie in unserem Leitfaden zur Fehlerbehebung bei 504 Gateway Timeout.
Die Domain ist nicht erreichbar
Prüfen Sie, ob der A-Eintrag Ihrer Domain auf die richtige öffentliche IP-Adresse verweist, die entsprechenden Firewall-Ports geöffnet sind und der Nginx-Serverblock zum angeforderten Hostnamen passt.
Häufig gestellte Fragen
proxy_pass legt fest, wohin Nginx Anfragen weiterleitet, beispielsweise an eine HTTP-Anwendung, die auf 127.0.0.1:3000 läuft.
Ja. Sie können separate Domains, Subdomains oder URL-Pfade konfigurieren, um Anfragen an unterschiedliche Backend-Anwendungen weiterzuleiten.
Nein. Sie können einen Reverse-Proxy mit einer IP-Adresse oder lokal testen. Eine Domain erleichtert jedoch das öffentliche Hosting und den Bezug eines standardmäßigen HTTPS-Zertifikats.
Ja. Die Open-Source-Version von Nginx unterstützt Reverse-Proxy-Funktionen ohne kommerzielle Lizenz.
Fazit
Sie haben einen Nginx-Reverse-Proxy unter Ubuntu konfiguriert, Anfragen an eine lokale Anwendung weitergeleitet und HTTPS aktiviert.
Die gleiche Grundkonfiguration lässt sich für Node.js, Python und andere HTTP-basierte Anwendungen anpassen, indem Sie die Backend-Adresse in proxy_pass ändern.
Bevor Sie diese Konfiguration produktiv einsetzen, stellen Sie sicher, dass Ihre Anwendung automatisch startet, mit geeigneten Berechtigungen läuft und ausreichend überwacht und abgesichert ist.