Configurare Nginx come Load Balancer in Linux
In presenza di elevato traffico sul proprio sito, o servizio on line, è abbastanza comune l'utilizzo di un sistema di bilanciamento del carico (un "balancer"), per distribuire il carico di richieste http tra più server (un "cluster" di server). Ovviamente i server del cluster dovranno erogare lo stesso sito.
Il bilanciamento del carico porta a numerosi vantaggi, tra cui la continuità di erogazione del sito/servizio: un sovraccarico di richieste su un singolo server potrebbe infatti determinare la non visualizzazione delle pagine o messaggio di errore del browser. Un balancer consente inoltre una maggiore scalabilità del servizio, infatti all'aumentare del traffico è possibile aggiungere più server.
In questo articolo vediamo come installare e configurare velocemente Nginx, rimandando le specificità ad altri articoli.
I metodi di bilanciamento del carico supportati da Nginx sono i seguenti:
- Round-robin
E' l'impostazione predefita di Nginx. Round Robin è un processo di distribuzione circolare del carico di richieste tra tutti i server del nostro cluster: ogni nuova richiesta viene assegnata al server successivo della serie e quindi gli accessi vengono ripartiti equamente tra tutti i server del cluster. - Least-connected
La richiesta successiva viene assegnata al server che in quel momento ha il minor numero di connessioni attive. - Ip-hash
Viene utilizzata una funzione hash per determinare su quale server indirizzare il traffico in base all'indirizzo IP del client.
Nginx effettua anche un controllo di integrità dei server: nel caso in cui un server non risponda evita di assegnargli richieste per un periodo di tempo configurabile (il valore predefinito è 10 secondi).
In questo articolo vediamo come utilizzare Nginx, su un server Linux Centos, come sistema di bilanciamento del carico per distribuire le richieste http tra due server web (ad esempio Apache).
A titolo di esempio, gli ip pubblici delle nostre macchine saranno le seguenti
Load Balancer (Nginx): ip pubblico 95.110.225.50, ip lan 192.168.1.1
Server web 1 (Apache): ip lan 192.168.1.2
Server web 2 (Apache): ip lan 192.168.1.3
I tre server comunicheranno tra loro tramite ip locale (192.168.1.x)
I due server web sono configurati per gestire il dominio "miosito.it", che abbiamo registrato presso un provider, come ad esempio Aruba.it.
A livello DNS abbiamo quindi definito un record A per questo dominio, che punta al Load Balancer
A Record @ 95.110.225.50
Il load balancer dovrà distribuire il carico di richieste ai due server web.
Bene, adesso che abbiamo definito il gruppo di server su cui dovremo lavorare, installiamo Nginx sulla nostra distribuzione Centos
yum install nginx
Su distribuzioni Ubuntu o Debian utilizziamo invece
apt install nginx
Ultimata l'installazione modifichiamo il file di configurazione di Nginx, utilizzando il nostro editor preferito, ad esempio "vi", in questo modo
vi /etc/nginx/conf.d/loadbalancer.conf
Incolliamo in questo file il seguente codice, in cui ogni blocco compreso tra parentesi graffe contiene istruzioni che devono terminare con il punto e virgola.
upstream backend {
server 192.168.1.2;
server 192.168.1.3;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name miosito.it;
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://backend;
}
}
Il primo blocco di configurazione è abbastanza intuitivo: indichiamo gli ip dei server sui cui il traffico verrà distribuito, e la modalità di distribuzione.
Questa è la modalità "Round-robin":
upstream backend {
server 192.168.1.2;
server 192.168.1.3;
}
Se invece vogliamo ottenere una distribuzione di tipo "least connected":
upstream backend {
least_conn;
server 192.168.1.2;
server 192.168.1.3;
}
Mentre per un bilanciamento di tipo "ip hash"
upstream backend {
ip_hash;
server 192.168.1.2;
server 192.168.1.3;
}
E' possibile influenzare la decisione di Nginx su come distribuire il carico, forzando il "peso" (l'importanza") dei server (ad esempio perchè un server ha più risorse, ram...)
Ad esempio se, con un balancing "round robin" vogliamo dare più carico al server 192.168.1.2, possiamo decidere che su ogni 10 richieste, 6 vadano a questo server (quindi il 60%) e le altre 4 andranno all'altro server.
upstream backend {
server 192.168.1.2; weight=6;
server 192.168.1.3;
}
Vediamo il secondo blocco della nostro esempio di configurazione:
server {
listen 80;
server_name miosito.it;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://miosito.it;
}
}
Ngnix resta in ascolto sulla porta 80 con riferimento al dominio "miosito.it"
Tutto il traffico ricevuto ("location /"), verrà reindirizzato sui server definiti nel primo blocco di codice.
Ricordiamoci che entrambi i server web sono stati configurati affinchè rispondano al dominio "miosito.it", e sarà l'istruzione "proxy_pass http://miosito.it" a fare in modo che i server delegati ricevano le richieste http con il dominio "miosito.it". NOTA: se volessimo far arrivare ai server web il traffico in https, indicheremo "proxy_pass https://miosito.it"
Stiamo indicando inoltre a Nginx di aggiungere, agli Header passati ai server web, le seguenti variabili ricevute dall'utente: X-Real-IP, con l'ip dell'utente, X-Forwarded-For e Host. Se non aggiungessimo queste istruzioni queste informazioni non verrebbero ricevute dai server web, questo perchè l'utente è atterrato sul server Nginx non sui server web!
Bene, adesso salviamo la configurazione (se usiamo l'editor vi, utilizziamo il comando ":wq"), ed avviamo Nginx
systemctl restart nginx
Ricordiamoci di avviare automaticamente Nginx ad ogni riavvio del server, così:
systemctl enable nginx
Infine, testiamo il funzionamento di Nginx.
Per capire quale su quale server viene direzionato il traffico, facciamo in modo che il server 192.168.1.2 risponda con una pagina che contenga il testo "questo è il server 1", mentre il server 192.168.1.3 risponda con una pagina web che contiene il testo "questo è il server 2".
A questo punto apriamo il nostro browser preferito e digitiamo la url del nostro dominio "http://miosito.it". Apparirà uno di questi due testi.
Riapriamo la stessa url varie volte, e vedremo alternarsi, in base al tipo di configurazione che abbiamo dato a Nginx, le due frasi, e quindi i due server.