Konfiguration von Nginx als Reverse-Proxy für Backend-Anwendungen
Einführung
In modernen Server-Setups kommunizieren Anwendungen selten direkt mit dem Internet. Stattdessen sitzt ein Reverse-Proxy vor ihnen und bearbeitet eingehende Client-Anfragen. Nginx ist eines der beliebtesten Tools für diese Aufgabe, da es schnell, zuverlässig und einfach zu konfigurieren ist. In diesem Tutorial lernen Sie, wie Sie Nginx als Reverse-Proxy für eine Backend-Anwendung konfigurieren, die auf demselben Server läuft.
Was ist ein Reverse-Proxy?
Ein Reverse-Proxy ist ein Server, der:
- Anfragen von Clients (Browsern, APIs usw.) entgegennimmt
- Diese Anfragen an eine Backend-Anwendung weiterleitet
- Die Antwort des Backends an den Client zurücksendet
Der Client kommuniziert nie direkt mit der Backend-Anwendung.
Reverse-Proxy vs. direkter Zugriff
Ohne einen Reverse-Proxy:
Client ---> Backend-Anwendung (Port 3000)
Mit einem Reverse-Proxy:
Client ---> Nginx (Port 80, 443) ---> Backend-Anwendung (Port 3000)
Warum Nginx als Reverse-Proxy verwenden?
Die Verwendung von Nginx vor Ihrer Anwendung ermöglicht Ihnen:
- Nur die Ports 80/443 dem Internet auszusetzen
- Backend-Dienste vor direktem Zugriff zu verbergen
- HTTPS (TLS) an einem Ort zu beenden
- Protokollierung, Zugriffskontrolle und Ratenbegrenzung hinzuzufügen
- Mehrere Anwendungen auf einem Server auszuführen
Für Systemadministratoren bedeutet dies bessere Sicherheit und einfachere Verwaltung.
Szenario, das in diesem Tutorial verwendet wird
Um die Dinge einfach zu halten, verwenden wir das folgende Setup:
- Nginx hört auf Port
80 - Die Backend-Anwendung hört auf
127.0.0.1:3000 - Anfragen an
http://example.comwerden an das Backend weitergeleitet
Diagramm des Datenflusses
[ Browser ] | v [ Nginx example.com:80,443 ] | v [ Backend-App 127.0.0.1:3000 ]
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:
- Einen Linux-Server mit dem neuesten stabilen Debian
- Root- oder Sudo-Zugriff
- Eine bereits laufende Backend-Anwendung (zum Beispiel eine Node.js-, Python- oder Java-App)
- Grundlegende Vertrautheit mit dem Linux-Terminal
Nginx installieren
Aktualisieren Sie die Paketlisten und installieren Sie Nginx und curl (zum Testen der Einrichtung):
sudo apt update
sudo apt install nginx curl
Überprüfen Sie, ob Nginx läuft:
systemctl status nginx
Sie sollten "active (running)" in der Ausgabe sehen.
Testen Sie Nginx lokal:
curl http://localhost
Wenn Nginx funktioniert, erhalten Sie die Standard-Willkommensseite.
Die Nginx-Konfigurationsstruktur verstehen
Nginx-Konfigurationsdateien werden normalerweise in /etc/nginx/ gespeichert. Wichtige Verzeichnisse:
/etc/nginx/nginx.conf— Hauptkonfigurationsdatei/etc/nginx/sites-available/— Site-Konfigurationsdateien (nicht aktiv)/etc/nginx/sites-enabled/— aktivierte Site-Konfigurationen (symbolische Links)
Nginx liest Konfigurationsdateien aus dem Ordner sites-enabled, nicht direkt aus sites-available. Es wird empfohlen, Site-Konfigurationsdateien in sites-available zu erstellen und dann symbolische Links zu ihnen in sites-enabled zu erstellen.
Eine Reverse-Proxy-Konfiguration erstellen
Eine neue Site-Datei erstellen
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Die Reverse-Proxy-Konfiguration hinzufügen
server { listen 80; server_name 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; } }
Die Konfiguration verstehen
Server-Block
server { listen 80; server_name example.com; }
listen 80;— Nginx hört auf HTTP-Verkehr auf Port 80server_name example.com;— Domainname, auf den dieser Server-Block reagiert
Location-Block
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; }
location /— passt auf alle eingehenden URLsproxy_pass— leitet Anfragen an die Backend-Anwendung weiter
Proxy-Header
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;
Diese Header stellen sicher, dass das Backend weiß:
- Den ursprünglichen Domainnamen
- Die echte IP-Adresse des Clients
- Ob die Anfrage HTTP oder HTTPS war
Ohne diese Header könnten Backend-Anwendungen falsche Client-Informationen protokollieren.
Die Konfiguration aktivieren
Deaktivieren Sie die Standard-Nginx-Site, um Konflikte auf Port 80 zu vermeiden:
sudo rm /etc/nginx/sites-enabled/default
Erstellen Sie einen symbolischen Link, um die Site zu aktivieren:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Testen Sie die Konfiguration auf Syntaxfehler:
sudo nginx -t
Wenn der Test erfolgreich ist, laden Sie Nginx neu:
sudo systemctl reload nginx
Den Reverse-Proxy testen
Testen Sie vom Server aus:
curl http://example.com
Öffnen Sie http://example.com in einem Browser, um zu testen. Sie sollten eine Antwort von Ihrer Backend-Anwendung erhalten, nicht von der Standardseite von Nginx. Wenn alles korrekt konfiguriert ist, wird die Backend-Anwendung geladen.
Wie die Anfrage verarbeitet wird
- Der Client sendet eine Anfrage an example.com
- Nginx empfängt die Anfrage auf Port 80
- Nginx leitet die Anfrage an 127.0.0.1:3000 weiter
- Das Backend verarbeitet die Anfrage
- Die Antwort geht zurück über Nginx
- Der Client erhält die Antwort
Häufige Fehler und Fehlerbehebung
Backend läuft nicht
- Stellen Sie sicher, dass die Anwendung läuft
- Bestätigen Sie den richtigen Port
ss -tuln | grep 3000
Falsche proxy_pass-Adresse
- Immer
http://einschließen - Stellen Sie sicher, dass die IP und der Port korrekt sind
Vergessen, Nginx neu zu laden
Nach jeder Konfigurationsänderung:
sudo systemctl reload nginx
Firewall blockiert den Zugriff
Stellen Sie sicher, dass Port 80 geöffnet ist:
sudo ufw allow 80
Optionale Verbesserungen
Sobald der Reverse-Proxy funktioniert, sollten Sie in Betracht ziehen:
- HTTPS mit Let's Encrypt zu aktivieren
- Mehrere Backend-Anwendungen auszuführen
- Zugriffsprotokolle und Fehlerprotokolle hinzuzufügen
- Lastverteilung zu konfigurieren
- WebSocket-Verbindungen zu unterstützen
HTTPS-Konfiguration
In Produktionsumgebungen sollten Sie immer HTTPS anstelle von HTTP verwenden. HTTPS verschlüsselt den Datenverkehr zwischen dem Client und Ihrem Server und schützt Passwörter, API-Tokens, Cookies und andere sensible Daten. Nginx unterstützt HTTPS mit SSL/TLS-Zertifikaten. In diesem Abschnitt lernen Sie:
- Was Certbot ist
- Wie man Certbot installiert
- Wie Certbot die Nginx-Konfiguration automatisch ändert
- Wie man Nginx manuell mit einem gekauften Zertifikat konfiguriert
Was ist Certbot?
Certbot ist ein Tool, das automatisch kostenlose SSL/TLS-Zertifikate von Let's Encrypt erhält und installiert. Es kann:
- Ein kostenloses Zertifikat anfordern
- Die Domain-Eigentümerschaft verifizieren
- Nginx automatisch konfigurieren
- Automatische Zertifikatserneuerung einrichten
Für Anfänger und die meisten Produktionsumgebungen ist Certbot der einfachste und sicherste Weg, um HTTPS zu aktivieren.
Certbot installieren
Aktualisieren Sie die Paketlisten:
sudo apt update
Installieren Sie Certbot und das Nginx-Plugin:
sudo apt install certbot python3-certbot-nginx
Das Paket python3-certbot-nginx ermöglicht es Certbot, Ihre Nginx-Konfiguration automatisch zu ändern.
Ein Zertifikat erhalten und installieren
Bevor Sie Certbot ausführen, stellen Sie sicher:
- Ihr Domainname zeigt auf die öffentliche IP-Adresse Ihres Servers
- Nginx läuft
- Ports 80 und 443 sind in der Firewall geöffnet
Führen Sie aus:
sudo certbot --nginx
Certbot wird:
- Fragen, welche Domain Sie sichern möchten
- Die Domain-Eigentümerschaft verifizieren
- Ihre Nginx-Konfiguration automatisch aktualisieren
- Nginx neu laden
Certbot ändert Ihre Nginx-Konfiguration automatisch. Es fügt typischerweise einen neuen Server-Block für Port 443 (HTTPS) hinzu, fügt SSL-Zertifikatspfade hinzu, konfiguriert eine HTTP-zu-HTTPS-Weiterleitung, wenn Sie diese Option wählen, und fügt empfohlene SSL-Einstellungen hinzu.
Beispielkonfiguration, die von Certbot hinzugefügt wurde:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 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; } }
Certbot kann auch den HTTP-Block ändern, um den Datenverkehr umzuleiten:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Da Certbot Konfigurationsdateien automatisch bearbeitet, wird empfohlen:
- Sichern Sie Ihre Konfigurationen
- Verstehen Sie, welche Änderungen vorgenommen wurden
- Testen Sie die Konfiguration immer nach Änderungen
Konfiguration testen:
sudo nginx -t
Automatische Zertifikatserneuerung
Let's Encrypt-Zertifikate sind 90 Tage gültig. Certbot installiert automatisch einen Erneuerungstimer. Sie können die Erneuerung mit folgendem Befehl testen:
sudo certbot renew --dry-run
Wenn alles korrekt konfiguriert ist, erfolgt die Erneuerung automatisch ohne Ausfallzeiten.
Verwendung eines gekauften SSL-Zertifikats
Wenn Sie ein SSL-Zertifikat von einer Zertifizierungsstelle (CA) kaufen, müssen Sie Nginx manuell konfigurieren. Nach dem Kauf erhalten Sie normalerweise:
- Eine Zertifikatsdatei (z.B.
example.com.crt) - Einen privaten Schlüssel (
example.com.key) - Eine CA-Bundle-Datei (
ca_bundle.crt)
Erstellen Sie ein sicheres Verzeichnis:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Kopieren Sie Ihre Zertifikatsdateien in dieses Verzeichnis.
Beispielkonfiguration für HTTPS mit einem gekauften Zertifikat:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; 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; } }
HTTP-zu-HTTPS-Weiterleitung hinzufügen:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Nginx nach manueller Konfiguration neu laden:
sudo nginx -t
sudo systemctl reload nginx
Für unerfahrene Systemadministratoren wird Certbot dringend empfohlen, es sei denn, Ihre Organisation erfordert kommerzielle Zertifikate.
Zusammenfassung
In diesem Tutorial haben Sie gelernt:
- Was ein Reverse-Proxy ist und warum er nützlich ist
- Wie Nginx Anfragen an Backend-Anwendungen weiterleitet
- Wie man eine Reverse-Proxy-Konfiguration erstellt und aktiviert
- Wie man häufige Probleme testet und behebt
- Wie man HTTPS konfiguriert
Nginx-Reverse-Proxying ist eine grundlegende Fähigkeit für Systemadministratoren und wird in Produktionsumgebungen häufig eingesetzt.