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.