Per offrirti un'esperienza di navigazione sempre migliore, questo sito utilizza cookie propri e di terze parti, partner selezionati. I cookie di terze parti potranno anche essere di profilazione.
Le tue preferenze si applicheranno solo a questo sito web. Puoi modificare le tue preferenze in qualsiasi momento ritornando su questo sito o consultando la nostra informativa sulla riservatezza.
E' possibile rivedere la nostra privacy policy cliccando qui e la nostra cookie policy cliccando qui.
Per modificare le impostazioni dei cookies clicca qui
  • seguici su feed rss
  • seguici su twitter
  • seguici su linkedin
  • seguici su facebook
  • cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



ricordami per 365 giorni

HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO ? CLICCA QUI E REGISTRATI !

Configurare Nginx come Load Balancer in Linux

di :: 12 febbraio 2020
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:

  1. 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.
  2. Least-connected
    La richiesta successiva viene assegnata al server che in quel momento ha il minor numero di connessioni attive.
  3. 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.

Approfondimenti

 
 
 
 
pay per script

Hai bisogno di uno script PHP personalizzato, di una particolare configurazione su Linux, di una gestione dei tuoi server Linux, o di una consulenza per il tuo progetto?

x

ATTENZIONE