NGINX: Load balancer in poche mosse
Pubblicato il 20/09/2013 in System Administration, Technology, Web • 2 min read
NGINX, oltre ad essere un server web ad alte prestazioni, è in grado di smistare il carico tra più backend e svolgere così il ruolo di load balancer, molto utile in situazioni ad alto traffico.
Scenario
Un sito web ad alto traffico può richiedere elevate risorse e queste possono essere incrementate sul singolo server (solitamente aumentando la quantità di memoria RAM e di CPU) oppure si può agire suddividendo le richieste http su più di un server: in questo caso si parla di load balancing.
Configurare NGINX affinché svolga il ruolo di load balancer è abbastanza semplice e le direttive da modificare sono poche.
Configurazione del VirtualHost
L'infrastruttura d'esempio prevede:
- un server con NGINX configurato come load balancer
- almeno due server con installato l'interprete PHP in modalità FCGI o FPM
Configurazione di base
upstream lb0 {
server 192.168.0.1:9000;
server 192.168.0.2:9000;
}
server {
port_in_redirect off;
listen 80;
server_name www.miodominio.com;
...
root /var/www/html;
...
location ~ .*\.php$ {
try_files $uri =404;
fastcgi_pass lb0;
...
}
Da questo file di configurazione è possibile notare - in grassetto - il blocco upstream in cui sono indicati i server a cui smistare le richieste e l'utilizzo di questo blocco come parametro della direttiva fastcgi_pass.
Le richieste vengono inviate in egual misura ai due (o più) server che hanno in ascolto l'interprete PHP.
Impostazioni avanzate
E' possibile modificare il metodo di smistamento delle richieste utilizzando il parametro weight nel blocco upstream, come nello snippet seguente:
upstream {
server 192.168.0.1:9000 weight=4;
server 192.168.0.2:9000;
}
Il valore di default del parametro weight è 1 ed a valore maggiore corrisponde un numero maggiore di richieste ricevute: in questo caso, il server con indirizzo IP 192.168.0.1 riceverà 4 volte il traffico del server con indirizzo IP 192.168.0.2 a cui non è stato impostato alcun peso.
Oltre al parametro weight è possibile impostarne altri rendendo più specifica la configurazione.
max_fails = numero
Indica il numero di tentativi di connessione prima di considerare il server non disponibile.
Il controllo viene effettuato entro il tempo impostato col parametro fail_timeout.
Il valore di default è 1 tentativo.
fail_timeout = secondi
Indica il numero di secondi in cui si attende una risposta.
Il valore di default è 10 secondi.
backup
Marca il server come utilizzabile solo nel caso in cui gli altri siano irraggiungibili.
down
Marca il server come permanentemente irraggiungibile
Una direttiva importante ai fini del bilanciamento di carico è la seguente:
ip_hash
Imposta il peso del bilanciamento basandolo sull'indirizzo IP del client che effettua la richiesta.
Tutti gli indirizzi IP della stessa classe C (o /24) raggiungeranno sempre lo stesso server di backend.
Quando si utilizza questa direttiva non è possibile utilizzare altri parametri per il peso.
Snippet
upstream {
server 192.168.0.1:9000 weight=4 max_fails=3 fail_timeout=20;
server 192.168.0.2:9000 max_fails=2;
server 192.168.0.3:9000 down;
server 192.168.0.4:9000 backup;
}
upstream {
ip_hash;
server 192.168.0.1:9000;
server 192.168.0.2:9000;
server 192.168.0.3:9000 down;
server 192.168.0.4:9000 backup;
}
Conclusioni
Abbiamo visto com'è possibile configurare semplicemente NGINX come un load balancer in modo da distribuire il carico su più backend ed ottimizzare così le prestazioni e l'affidabilità dell'infrastruttura web.