Wie kann ich eine Lastverteilung (Load Balancing) in NGINX einrichten?
- Einleitung
- Grundprinzip der Lastverteilung mit NGINX
- Konfiguration eines einfachen Round-Robin Load Balancing
- Erweiterte Load Balancing Methoden
- Health Checks und Fehlerbehandlung
- Performance und Caching
- Zusammenfassung
Einleitung
NGINX ist ein leistungsfähiger Webserver, der neben seiner Funktion als Webserver auch als Reverse Proxy und Load Balancer eingesetzt werden kann.
Die Lastverteilung ermöglicht es, eingehende Anfragen auf mehrere Backend-Server zu verteilen, um die Verfügbarkeit zu erhöhen und die Last auf einzelne Server zu reduzieren.
Grundprinzip der Lastverteilung mit NGINX
Beim Load Balancing fungiert NGINX als zentraler Proxy, der ankommende HTTP- oder TCP-Anfragen annimmt und diese an einen Pool von Servern weiterleitet.
In der Konfiguration definiert man sogenannte upstream-Blöcke, in denen die Backend-Server aufgelistet sind.
Innerhalb des server-Blocks wird dann festgelegt, dass die Anfragen mithilfe des definierten Upstream-Pools verteilt werden.
Konfiguration eines einfachen Round-Robin Load Balancing
Ein typisches Beispiel für das Einrichten eines Load Balancers in NGINX sieht folgendermaßen aus:
Zunächst definiert man im Abschnitt http den Upstream-Pool mit mehreren Serveradressen.
NGINX verteilt die eingehenden Anfragen standardmäßig im Round-Robin-Verfahren, also abwechselnd auf die einzelnen Server.
http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { listen 80; location / { proxy_pass http://backend; 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; } }}In diesem Beispiel steht backend für den Upstream-Namen. Die drei Backend-Server sind als backend1.example.com, backend2.example.com und backend3.example.com angegeben.
Erweiterte Load Balancing Methoden
Neben dem Standard Round-Robin bietet NGINX weitere Methoden zur Lastverteilung an. So kann man beispielsweise das least_conn-Verfahren verwenden, bei dem der Server mit den aktuell wenigsten Verbindungen bevorzugt wird.
Ebenfalls möglich ist das Hash-basierte Balancing, etwa über ip_hash, wo Anfragen von der gleichen IP immer an denselben Backend-Server geleitet werden, was für Sitzungsaffinität (Session Persistence) nützlich ist.
upstream backend { least_conn; server backend1.example.com; server backend2.example.com;} upstream backend { ip_hash; server backend1.example.com; server backend2.example.com;}Health Checks und Fehlerbehandlung
Um die Zuverlässigkeit zu erhöhen, unterstützt NGINX die Konfiguration von Health Checks. Im Open-Source-NGINX sind die Möglichkeiten hierfür eingeschränkt,
aber Module wie nginx_upstream_check_module oder die kommerzielle Version NGINX Plus bieten umfangreiche Überwachungsfunktionen.
Wenn ein Backend-Server ausfällt, kann NGINX ihn automatisch aus dem Rotation-Pool entfernen, um fehlerhafte Weiterleitungen zu vermeiden.
Performance und Caching
Durch die Lastverteilung kann der Traffic besser verteilt werden, was die Antwortzeiten insgesamt verkürzt. Zusätzlich kann man in NGINX Caching einrichten, um statische Inhalte oder häufig angefragte Daten zu speichern,
Zusammenfassung
Das Einrichten von Load Balancing in NGINX erfolgt primär über die Definition eines Upstream-Blocks mit den Backend-Servern und der Verwendung von proxy_pass, um Anfragen an diesen Pool weiterzuleiten.
Je nach Anwendungsfall kann man unterschiedliche Balancing-Methoden wählen, um entweder die Last gleichmäßig zu verteilen, Sitzungsaffinität zu gewährleisten oder Verbindungen gleichmäßiger zu balancieren.
Für den produktiven Betrieb empfiehlt sich zudem die Überwachung der Backend-Server und das Einrichten von Health Checks.
