Wie konfiguriert man NginxProxyManager für Load Balancing von Proxy-Diensten?
Nginx Proxy Manager (NPM) ist ein leistungsstarkes, auf Nginx basierendes Tool zur Verwaltung von Reverse-Proxys, aber die Konfiguration von serverseitiger Lastverteilung ist etwas umständlich.
Wird gerendert...
NginxProxyManager (NPM) als leistungsstarkes Tool zur Verwaltung von Reverse-Proxys auf Basis von Nginx ist bei Benutzern aufgrund seiner intuitiven Weboberfläche sehr beliebt. Obwohl NPM hauptsächlich zur Verwaltung von Proxys für einzelne Backend-Dienste verwendet wird, können wir durch die geschickte Kombination der benutzerdefinierten Konfigurationsmöglichkeiten von Nginx auch leistungsstarke Lastausgleichsfunktionen implementieren.
Dieser Artikel beschreibt detailliert, wie Sie durch Ändern/Hinzufügen benutzerdefinierter Konfigurationsdateien und unter Verwendung der Einstellung "Custom Nginx Configuration" im NginxProxyManager-Dashboard Lastausgleich für Ihre Proxydienste konfigurieren können. Wir konzentrieren uns auf diese Lösung und behandeln keine anderen Implementierungsansätze.
## 1. Vorbereitungen
Bevor Sie mit der Konfiguration beginnen, stellen Sie sicher, dass Sie die folgenden Vorbereitungen abgeschlossen haben:
* **NginxProxyManager ist installiert und funktioniert ordnungsgemäß**: Sie können es über Docker oder direkt installieren.
* **Mehrere Backend-Dienstinstanzen**: Sie benötigen mindestens zwei oder mehr Backend-Server, die denselben Dienst bereitstellen (z. B. Webanwendungsinstanzen, die auf verschiedenen IPs oder Ports laufen).
* **Zugriffsberechtigung auf das NPM-Datenverzeichnis**: Sie müssen auf das Verzeichnis `/data/nginx/` innerhalb des NPM-Containers zugreifen können, was normalerweise durch Docker-Volume-Mounts realisiert wird.
## 2. Kernoperationen der Lösung
Die Kernidee dieser Lösung ist:
1. Erstellen Sie eine benutzerdefinierte Nginx-Konfigurationsdatei im NPM-Datenverzeichnis, um eine oder mehrere "Upstream-Servergruppen" (`upstream`) zu definieren.
2. Nutzen Sie die Option "Custom Nginx Configuration" in der Proxy-Host-Konfiguration von NPM, um Anfragen an unsere benutzerdefinierte Upstream-Servergruppe weiterzuleiten.
### 2.1. Erstellen einer benutzerdefinierten Upstream-Server-Konfigurationsdatei
Zuerst müssen wir eine benutzerdefinierte Datei im Nginx-Konfigurationsverzeichnis von NPM erstellen, um die Lastausgleichs-Upstream-Servergruppen zu definieren.
1. **Zugriff auf das NPM-Datenverzeichnis**:
Normalerweise befinden sich die Nginx-Konfigurationen von NPM innerhalb des Docker-Containers unter `/etc/nginx/conf.d/` oder `/data/nginx/`. Für Persistenz und einfache Verwaltung lädt NPM benutzerdefinierte Konfigurationen aus dem Verzeichnis `/data/nginx/custom/`.
Wenn Sie NPM über Docker ausführen, können Sie auf dieses Verzeichnis über einen Volume-Mount zugreifen. Wenn Ihr NPM-Container beispielsweise das lokale Verzeichnis `./npm_data` in `/data` innerhalb des Containers gemountet hat, sollten Sie die Datei im Pfad `./npm_data/nginx/custom/` erstellen.
2. **Erstellen oder Ändern der Konfigurationsdatei**:
Erstellen Sie eine neue `.conf`-Datei im Verzeichnis `/data/nginx/custom/`, z. B. mit dem Namen `http_upstream.conf`.
```bash
# Beispiel: Wenn Sie sich auf dem Host befinden und npm_data ein gemountetes Verzeichnis ist
cd /path/to/your/npm_data/nginx/custom/
touch http_upstream.conf
```
3. **Bearbeiten der Datei `http_upstream.conf`**:
Öffnen Sie `http_upstream.conf` mit Ihrem bevorzugten Texteditor und fügen Sie den folgenden Inhalt hinzu:
```nginx
# Definiert eine Upstream-Servergruppe namens 'my_backend_servers'
upstream server_cluster {
# Backend-Server 1: IP-Adresse und Port, Gewichtung 5
server 192.168.1.100:8080 weight=5 max_fails=3 fail_timeout=30s;
# Backend-Server 2: IP-Adresse und Port, Gewichtung 3
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
# Backend-Server 3: IP-Adresse und Port, Standardgewichtung 1
server 192.168.1.102:8080;
# Backup-Server: Wenn alle Hauptserver nicht verfügbar sind, wird der Traffic an diesen Server weitergeleitet
# server 192.168.1.103:8080 backup;
# Als nicht verfügbar markiert: Wird normalerweise für temporäre Wartungsarbeiten verwendet
# server 192.168.1.104:8080 down;
# Lastausgleichsalgorithmus (optional, Standard ist Round-Robin):
# round-robin (Standard)
# least_conn; # Wenigste Verbindungen
# ip_hash; # Hash basierend auf der Client-IP, um Session-Stickiness zu erreichen
# hash $request_uri consistent; # Hash basierend auf der URI
}
# Wenn Sie andere Dienste haben, die Lastausgleich benötigen, können Sie weitere upstream-Blöcke definieren
# upstream server_cluster {
# server 192.168.1.200:9000;
# server 192.168.1.201:9000;
# }
```
**Parametererklärung**:
* `upstream my_backend_servers { ... }`: Definiert eine Upstream-Servergruppe namens `my_backend_servers`. Dieser Name wird in der benutzerdefinierten Konfiguration von NPM verwendet.
* `server IP:PORT`: Gibt die IP-Adresse und den Port des Backend-Servers an.
* `weight=N`: Legt das Gewicht des Servers fest. Je höher das Gewicht, desto mehr Anfragen leitet Nginx an diesen Server weiter. Das Standardgewicht ist 1.
* `max_fails=N`: Wenn Nginx innerhalb des `fail_timeout`-Zeitraums N Mal keine Verbindung zum Backend-Server herstellen kann, gilt der Server als nicht verfügbar. Standard ist 1.
* `fail_timeout=Ns`: Wenn die Anzahl der fehlgeschlagenen Verbindungen zum Server innerhalb von N Sekunden `max_fails` erreicht, wird der Server als nicht verfügbar markiert und nach Ablauf von `fail_timeout` erneut versucht. Standard ist 10 Sekunden.
* `backup`: Markiert den Server als Backup-Server. Anfragen werden nur an `backup`-Server weitergeleitet, wenn alle Nicht-`backup`-Server nicht verfügbar sind.
* `down`: Markiert den Server als dauerhaft nicht verfügbar. Wird normalerweise verwendet, um einen Server vorübergehend zu deaktivieren.
* **Lastausgleichsalgorithmen**:
* `round-robin` (Standard): Verteilt Anfragen sequenziell an jeden Server.
* `least_conn`: Sendet Anfragen an den Server mit den wenigsten aktuellen Verbindungen.
* `ip_hash`: Verteilt Anfragen basierend auf dem Hash der Client-IP-Adresse an die Server, um sicherzustellen, dass Anfragen desselben Clients immer an denselben Server gesendet werden, was Session-Stickiness ermöglicht.
### 2.2. Konfigurieren des Proxy-Hosts in NginxProxyManager
Als Nächstes erstellen wir in der Weboberfläche von NPM einen neuen Proxy-Host und nutzen dessen Funktion "Custom Nginx Configuration", um unsere definierte Upstream-Servergruppe zu referenzieren.
1. **NginxProxyManager anmelden**:
Öffnen Sie Ihre NPM-Weboberfläche und melden Sie sich an.
2. **Neuen Proxy-Host hinzufügen**:
Navigieren Sie zur Seite "Proxy Hosts" und klicken Sie auf "Add Proxy Host".
3. **Registerkarte "Details" ausfüllen**:
* **Domain Names**: Geben Sie den Domainnamen ein, über den Sie auf den Dienst zugreifen möchten (z. B. `myapp.example.com`).
* **Scheme**: Wählen Sie `http` oder `https`, je nachdem, welches Protokoll Ihr Backend-Dienst verwendet.
* **Forward Hostname / IP**: **Geben Sie hier einen Platzhalter ein, z. B. `127.0.0.1`.** Da wir das tatsächliche Weiterleitungsziel in "Custom Nginx Configuration" überschreiben, hat diese Einstellung keine Auswirkung, aber NPM verlangt, dass dieses Feld ausgefüllt wird.
* **Forward Port**: **Geben Sie ebenfalls einen Platzhalter ein, z. B. `80`.**
* Aktivieren Sie je nach Bedarf Optionen wie `Cache Assets`, `Block Common Exploits`, `Websockets Support` usw.
4. **Registerkarte "SSL" konfigurieren**:
Konfigurieren Sie das SSL-Zertifikat entsprechend Ihrem Domainnamen und Ihren Zertifikatsdetails. Es wird empfohlen, Let's Encrypt für die automatische Beantragung zu verwenden.
5. **"Advanced" konfigurieren**:
Dies ist der wichtigste Schritt. Suchen Sie auf der Registerkarte "Advanced" das Feld `Custom Nginx Configuration` und geben Sie in dieses Textfeld den folgenden Nginx-Konfigurationscode ein:
```nginx
location / {
proxy_pass http://server_cluster;
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;
}
```
**Erklärung**:
* `proxy_pass http://my_backend_servers;`: Diese Direktive weist Nginx an, alle Anfragen, die an diesen Proxy-Host gesendet werden, an die Upstream-Servergruppe namens `my_backend_servers` weiterzuleiten. Nginx verteilt die Anfragen basierend auf dem Lastausgleichsalgorithmus und der Serverliste, die Sie in `http_upstream.conf` definiert haben.
* `proxy_set_header ...`: Diese Direktiven legen die HTTP-Request-Header fest, um sicherzustellen, dass der Backend-Server die tatsächliche IP-Adresse des Clients, den ursprünglichen Anforderungsnamen und das Protokoll usw. korrekt erkennt. Dies ist entscheidend für die Protokollierung, Sicherheitsrichtlinien und den ordnungsgemäßen Betrieb bestimmter Anwendungen.
6. **Proxy-Host speichern**:
Klicken Sie auf die Schaltfläche "Save", um Ihre Proxy-Host-Konfiguration zu speichern. NPM lädt die Nginx-Konfiguration automatisch neu, damit die Änderungen wirksam werden.
### 2.3. Überprüfung der Lastausgleichskonfiguration
Nach Abschluss der Konfiguration müssen Sie überprüfen, ob der Lastausgleich ordnungsgemäß funktioniert.
1. **Rufen Sie Ihren Domainnamen auf**:
Rufen Sie Ihren konfigurierten Domainnamen (z. B. `http://myapp.example.com` oder `https://myapp.example.com`) im Browser auf.
2. **Überprüfen Sie die Backend-Serverantworten**:
Wenn Ihr Backend-Dienst die Identifizierung seines Servers anzeigen kann (z. B. Server-IP, Hostname oder eindeutiger Seiteninhalt), können Sie die Seite mehrmals aktualisieren und beobachten, ob die Anfragen auf verschiedene Backend-Server verteilt werden.
3. **Überprüfen Sie die NginxProxyManager-Protokolle**:
Überprüfen Sie die Protokolle von NPM, um sicherzustellen, dass keine Konfigurationsfehler vorliegen.
4. **Backend-Server-Protokolle**:
Überprüfen Sie die Zugriffsprotokolle der Backend-Server, um sicherzustellen, dass die Anfragen tatsächlich von NPM stammen und auf verschiedene Server verteilt wurden.
## 4. Zusammenfassung und Hinweise
Mit den oben genannten Schritten haben Sie erfolgreich den Lastausgleich für Ihren Proxydienst in NginxProxyManager konfiguriert. Diese Methode nutzt die Bequemlichkeit der NPM-Verwaltungsoberfläche und die Flexibilität der Nginx-Konfiguration auf niedriger Ebene.
**Hinweise**:
* **Session-Stickiness**: Wenn Ihre Anwendung eine Verbindung der Benutzersitzung zu einem bestimmten Backend-Server erfordert (z. B. nachdem sich ein Benutzer angemeldet hat, muss er denselben Server aufrufen), müssen Sie möglicherweise den `ip_hash`-Lastausgleichsalgorithmus verwenden oder die Sitzungsteilung auf Anwendungsebene implementieren (z. B. mit Redis).
* **Health Checks**: Die Nginx-Parameter `max_fails` und `fail_timeout` bieten grundlegende Health-Check-Funktionen. Für erweiterte Health Checks (z. B. Überprüfung des Antwortinhalts einer bestimmten URL) müssen Sie möglicherweise andere Tools oder komplexere Nginx-Konfigurationen verwenden.
* **Konfigurationsaktualisierungen**: Wenn Sie die Datei `http_upstream.conf` ändern, lädt NPM die Nginx-Konfiguration nicht automatisch neu. Sie müssen sich in die NPM-Weboberfläche einloggen, einen beliebigen Proxy-Host auswählen, ihn bearbeiten und speichern (ohne tatsächliche Änderungen vorzunehmen), damit NPM alle Nginx-Konfigurationen neu lädt. Alternativ können Sie, wenn Sie direkt mit Docker arbeiten, den NPM-Container neu starten.
> Haben Sie andere Lösungsansätze?Kommentar
Melde dich an, um Kommentare anzuzeigen und zu veröffentlichen
Zur Anmeldung