Creare un load balancer con nginx

Un load balancer è uno strumento utilissimo per bilanciare e ridurre il carico di risorse richieste dai nostri siti web e dalle nostre applicazioni esposte in rete.
In poche parole si possono “distribuire” le richieste su due o più server e la gestione di questo processo avviene grazie a un layer nginx che funge da “direttore” in grado di dirigere le richieste in ingresso distribuendole sui diversi server inclusi nelle regole di balancer.

Vediamo ora come creare un semplice balancer.

Per prima cosa dobbiamo procurarci una macchina VPS con Linux Ubuntu.

Successivamente seguiremo questi passi:

1 – Istallare nginx

sudo apt-get install nginx

2 – Configurare il modulo di Upstream

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

editando al suo interno la lista di server da richiamare:

upstream backend  {
  server backend1.example.com;
  server backend2.example.com;
  server backend3.example.com;
}

3 – Riavviare il servizio nginx

sudo service nginx restart

E’ bene sapere che abbiamo appena configurato un balancer in modalità “Round Robin” ovvero un bilanciamento “sequenziale” tra i server configurati ma è utile sapere che possiamo anche configurare dei “pesi” all’interno dell’elenco dei server richiamabili.

upstream backend  {
  server backend1.example.com weight=1;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;
}

Ricordiamoci che il peso di default in una configurazione Round Robin è 1.
Con un peso 2 per esempio, backend2.example riceverà il doppio del traffico rispetto a backend1 mentre backend3 con un peso pari a 4 riceverà il doppio del traffico rispetto a backend2 e il quadruplo del traffico rispetto a backend1.

nginx però ci consente anche di introdurre una direttiva sicuramente utile per siti web che utilizzano sessioni per erogare i propri servizi.
Grazie alla funzione ip_hash infatti, se dichiata, possiamo dirottare utenti con lo stesso IP sempre verso lo stesso server richiamato inizialmente in modo da non avere interruzioni di sessione dovuti al cambio macchina tra una richiesta e l’altra.

Ecco come si presenterà quindi la configurazione in caso di IP_HASH:

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
 }

Il marker down si può assegnare a un server che si vuole escludere dalla rindondanza IP.

Si possono inoltre aggiungere delle specifiche riguardo il numero massimo di redirect “falliti” supportati server per server o il tempo massimo di timeout di ogni singolo nodo in modo da ottimizzare il carico del balancer… esempio:

upstream backend  {
  server backend1.example.com max_fails=3  fail_timeout=15s;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;