Last Updated on 28/10/2024 by administrator
Nginx – Konfigurace Load Balanceru (NGINX Load Balancer)
Nginx – Konfigurace Load Balanceru (NGINX Load Balancer)
Motivace:
Nginx může být používán jako load balancer pro distribuci provozu mezi více backend serverů. Nginx poskytuje několik strategií load balancingu, včetně round-robin, least connections, a dalších.
Návod ukazuje tak nakonfigurovat Nginx jako load balancer pro dva webové servery a následně pro ně získat SSL certifikát.
OS:
Implementace byla prováděna na Ubuntu 22.04 LTS. Nicméně návod bude pravděpodobně aplikovatelný na nižší verze Ubuntu.
Topologie sítě:
Princip funkce:
Mějme dva webové servery (tzn. backend servery) pod IP adresama 192.168.0.150 a 192.168.0.151. Ty jsou schované za Nginx reverzní proxy pod IP adresou 192.168.0.120.
Klient (například webový prohlížeč) zadá webovou adresu mujweb.mooo.com do svého prohlížeče a odešle HTTPS požadavek na tuto adresu. Doménové jméno mujweb.mooo.com je je přeloženo na nějakém DNS serveru na IP adresu 7.47.97.41. Požadavek od klienta nejprve dorazí k routeru, který přeloží IP adresu 7.47.97.41 na 192.168.0.120 a tímto požadavek dorazí na Nginx load balanceru. Nginx analyzuje příchozí HTTPS požadavek od klienta. Podle své konfigurace typu load balancingu rozhodne, na který backend server přesměrovat požadavek.
Implementace [1]:
Veškterá implemetace se provádí na Nginx serveru (192.168.0.120).
apt install nginx -y
Pokud je nakonfigurovaný firewall (lze zjistit příkazem sudo ufw status), je nutné povolit provoz TCP/443 a TCP/80:
sudo ufw allow 443/tcp sudo ufw allow 80/tcp
Konfigurace Virtualhosta pro doménu mujweb.mooo.com:
Vytvořit soubor s názvem mujweb.mooo.com:
vi /etc/nginx/sites-available/mujweb.mooo.com
a vložit do něj tento konfigurační blok níže. V níže uvedené konfiguraci je rozdělení zátěže mezi backend servery rovnoměrné:
upstream weboveservery { server 192.168.0.151; server 192.168.0.152; } server { listen 80; server_name mujweb.mooo.com; location / { proxy_pass http://weboveservery; 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; } }
Legenda:
- upstream – definuje skupinu backend serverů s názvem weboveservery
- listen 80 – Nginx naslouchá na portu 80, který je obvyklým portem pro HTTP.
- server_name – Definuje doménu pro tento virtuálního host, v tomto případě mujweb.mooo.com
- proxy_pass – Tato direktiva říká Nginx, aby přesměroval všechny požadavky na adresu definovanou v bloku upstream s názvem weboveservery.
- proxy_set_header – Tyto direktivy nastavují specifické HTTP hlavičky pro předání informací o původním požadavku
Vytvořit symbolický link mezi konfiguračním souborem pro virtuálního hosta /etc/nginx/sites-available/mujweb.mooo.com a adresářem /etc/nginx/sites-enabled/, který Nginx načítá pro aktivní virtuální hosty:
sudo ln -s /etc/nginx/sites-available/mujweb.mooo.com /etc/nginx/sites-enabled/
Pro zkontrolování Nginx syntaxe použít:
sudo nginx -t
Provést restart služby Nginx:
sudo systemctl reload nginx
Základní konfigurace hotova!
Jak odebrat server z load balancingu:
Pokud je nutné dočasně odebrat backend server z rotace load balancingu, provede se to parametrem down:
upstream backend { server 192.168.0.151; server 192.168.0.152 down; }
Typy load balancingu [2]:
Round Robin:
Jedná se o nejjednodušší formu load balancingu, kde je každý nový požadavek přidělen jednomu ze serverů v cyklickém pořadí. Tento přístup je jednoduchý, ale nebere v úvahu aktuální stav serverů. Jedná se o defaultní formu load balancingu.
Least connection
Least connection je algoritmus load balancingu v Nginx, který směruje nové požadavky na server s nejnižším aktuálním počtem aktivních spojení. Tato strategie se snaží minimalizovat počet aktivních spojení na jednotlivých backend serverech, což může být užitečné, pokud servery mají různou kapacitu nebo výkon.
Příklad nastavení:
upstream backend { least_conn; server 192.168.0.151; server 192.168.0.152; }
IP Hash:
Algoritmus IP hash je způsob, jakým Nginx rozhoduje, který server z backend skupiny bude obsluhovat konkrétní klienta na základě zdrojové IP adresy klienta. To znamená, že požadavky od stejné IP adresy budou vždy směrovány na stejný backend server. Toto může být užitečné v případech, kdy je potřeba udržet stavové informace na serveru pro konkrétního klienta (client’s session “sticky” or “persistent”), což je často případ například u aplikací, které používají relace.
upstream backend { ip_hash; server 192.168.0.151; server 192.168.0.152; }
Další typy load balancingu [1]:
Weight:
Weight jsou užitečné ve scénářích, kde backend servery mají různou kapacitu nebo výkonnost. Pomocí váh lze dosáhnout vyvážení zátěže tak, aby výkonnější servery dostávaly větší podíl provozu. Vyšší váha znamená, že na daný backend server bude směrováno více požadavků než na servery s nižší váhou. Defaultní hodnota je weight=1:
Příklad nastavení, kdy server 192.168.0.151 bude dostávat 3x více zátěže, než server 192.168.0.152.
upstream backend { server 192.168.0.151 weight=3; server 192.168.0.152 weight=1; }
Další metody load balancingu jsou uvedené zde.
Health check:
Při použití open-source verze Nginx (bez Nginx Plus) není přímo k dispozici zabudovanou podporu pro health checks [2]. Nicméně pokud se jeden z backend serveru stane nedostupným, Nginx automaticky přesměruje HTTP požadavek na dostupný backend server v reálném čase.
V praxi to probíhá docela rychle.
Zabezpečení serverů pomocí SSL:
Pro zabezpečení webových serverů je možné získat certifikát zdarma na 3 měsíce. Vše se opět konfiguruje na Nginx serveru (192.168.0.120), kde stačí stáhnout certifikát pro doménové jméno a jsou tímto pokryty všechny backend servery.
V tomto článku je uvedeno jak nainstalovat Certbota na Nginx server.
Zdroj:
[1] https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
[2] https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/