Serverload-Balancing via nginx

Zur Lastverteilung (englisch Load Balancing) gibt es verschiedene Mechanismen, wie z.B. über die Überwachung der CPU oder des RAMs, welche je nach Auslastung einen weiteren Server ansteuert, um die Last der Anfragen zu verteilen.
Server Load Balancing (SLB) ist der perfekte Weg, um die Verfügbarkeit von Webseiten oder Webapplikationen mit großer Auslastung bzw. mit einer hohen Besucherdichte, wie z.B. wikipedia.com oder wordpress.org, zu gewährleisten. Durch die SLB wird die Überlastung eines einzelnen Servers verhindert, da der Front-End Load-Balancer Server die Anfragen, je nach Konfiguration, Server-Load oder Standort des Besuchers (Geolocation) auf einen anderen Server leitet.

Unterstütze Mechanismen

Die folgenden Load Balancing Mechanismen werden von nginx unterstützt:

  • Round-Robin: Beim Round-Robin Verfahren wird jeder Server in der Reihenfolge ausgewählt, in der dieser in der Konfiguration je nach Parameter (z.B. weight) festgelegt wurde.
  • Least-connected: Der anfragende Client wird zu einem Server mit der kleinsten Anzahl an aktiven Verbindungen geleitet.
  • Ip-hash: Dabei werden die ersten drei Teile der IPv4, bzw die ganze Adresse der IPv6 des Clients genutzt, um einen Hash-Schlüssel zu erzeugen. Diese Methode stellt sicher, dass Anfragen vom selben Client immer an denselben Server weitergeleitet werden, außer dieser ist nicht mehr verfügbar. Im letzteren Fall werden Client-Anfragen an einen anderen Server weitergeleitet, höchstwährscheinlich wird es dann immer derselbe Server sein.

 

Performance

Im Jahr 2008, hat WordPress, welches 2005 sein Shared-Hosting Angebot gestartet hat, ihre Load-Balancing Software von Pound auf nginx gewechselt. WordPress.com, die Adresse, welche für die Shared Hosting Plans genutzt wird, und weltweit den Rank 61, laut Alexa, vom Traffic her belegt, hat auch schon vorher Software wie pound, HAProxy oder LVS getestet, war aber ausschließlich von nginx überzeugt, weswegen die Entscheidung zur richtigen Software nicht lange auf sich warten ließ.

Gründe die für nginx laut WordPress sprechen:

  • Einfach, flexibel und logische Konfiguration
  • Möglichkeit nginx on-the-fly zu aktualisieren bzw. zu rekonfigurieren (ohne Nutzer-Anfragen zu verlieren)
  • Hält bis zu 20.000 Anfragen pro Sekunde auf einen einzelnen Server aus
  • Auslastung – CPU und RAM Verbrauchg sind minimal. – Seit nginx zum Einsatz gebracht wurde, hat sich der CPU Verbrauch um das dreifache verringert.
  • Unterstützung von HTTP, HTTPS, TCP, UDP, FastCGI, uwsgi, SCGI, memcached und gRPC
  • Im Jahr 2012 verzeichnete WordPress.com, mit zu dem Zeitpunkt 36 nginx Load Balancer Servern, im Schnitt 70.000 Anfragen und über 15 Gbit die Sekunde.

 

 

Installation

Die nachfolgenden Zeilen erläutern die Basisinstallation, über den Paket Manager, auf einem Debian Betriebssystem.

# Debian 8
echo "http://nginx.org/packages/debian/ jessie nginx" | sudo tee -a /etc/apt/sources.list
echo "ttp://nginx.org/packages/debian/ jessie nginx" | sudo tee -a /etc/apt/sources.list
# Debian 9
echo "deb http://nginx.org/packages/debian/ stretch nginx" | sudo tee -a /etc/apt/sources.list
echo "deb-src http://nginx.org/packages/debian/ stretch nginx" | sudo tee -a /etc/apt/sources.list
# Installation nginx
sudo apt-get update
sudo apt-get install nginx

Konfiguration

Mit lediglich ein paar Zeilen mehr Code, lässt sich selbst für Laien eine Load Balancing innerhalb kürzester Zeit konfigurieren. Der Wert „weight“ bestimmt die Verteilung, je höher der Wert ist, desto mehr Traffic wird diesem Server zugeordnet.
Der Standard Wert liegt bei 1. Falls ein Server wissentlich für längere Zeit nicht erreichbar sein sollte, kann der Wert „down“ hinzugefügt werden, damit nginx diesen nicht weiter anfragt. Alternativ können weitere Parameter wie „max_fails=3“ oder „fail_timeout=30s (Standard 10s)“, damit nginx nicht dauerhaft Anfragen an einen nicht erreichbaren Server schickt.

sudo nano /etc/nginx/sites-available/default

http {
# […]
  upstream backend {
    server backend1.domain.com weight=1;
      server backend2.domain.com weight=2;
      server backend3.domain.com weight=3 fail_timeout=30s;
      server backend4.domain.com weight=4 down;
  }
# […]
  server {
    listen 80;
    server_name domain.com www.domain.com
    location / {
      proxy_pass http://backend;
    }
  }
}

SSL Konfiguration

server {
  listen 443 ssl;
  server_name ;
  ssl_certificate /etc/letsencrypt/live/certificate.pem;
  ssl_certificate_key /etc/letsencrypt/live/privatekey.pem;
  location / {
    proxy_pass http://backend;
  }
}

Parameter

  • weight: Gewichtung der Wichtigkeit der Server, der Standartwert liegt bei 1.
  • max_conns: Limitiert die maximale Anzahl von simultanen aktiven Verbindungen. Der Standartwert liegt bei 0, was bedeutet, dass es kein Limit gibt
  • max_fails: Setzt die Anzahl der fehlgeschlagenen Verbindungsversuche fest. Der Standartwert liegt bei 1.
  • backup: Setzt den Server als Backup Server und leitet Anfragen an dieses nur weiter, wenn der Primär-Server nicht erreichbar ist.
  • down: Setzt den Server permanent als unerreichbar.

Weitere Parameter können in der nginx Dokumentation gefunden werden.

Fazit

Dieser Artikel zeigt, wie schnell und flexibel eine Load Balancer Lösung, um eine Lastenverteilung im Netzwerk der verwendeten Webapplikationen zu vernehmen, mit Hilfe des nginx-Servers, realisiert werden kann.

Quellen

barry.blog
nginx.com

 

JS