Un Load Balancer è un bilanciatore di carico e si utilizza per suddividere le richieste degli utenti su più server in situazioni di alto traffico o picchi di richieste. Nel moderno mondo sempre più digitalizzato e in continua evoluzione, la scalabilità e l’affidabilità delle applicazioni web sono caratteristiche essenziali per il successo di qualsiasi progetto. Un elevato volume di traffico può mettere a dura prova le infrastrutture web, causando rallentamenti o addirittura disservizi. Ecco perché l’utilizzo di un load balancer efficiente è diventato una scelta imprescindibile per aziende e organizzazioni che desiderano garantire un’esperienza utente ottimale e proteggere la propria reputazione online.
I più noti e utilizzati cloud provider, come AWS, Google Cloud, Digital Ocean, ma anche provider minori, mettono a disposizioni soluzioni di load balancing spesso gestibili via API o da interfaccia web. E’ importante tuttavia comprendere le tecnologie che stanno alla base di questi servizi in modo da poterli configurare e sfruttare al meglio e far fronte ad eventuali problematiche che dovessero presentarsi. Un’attenta configurazione è la chiave sia per questioni di sicurezza che di budget. Essendo la tariffazione dei servizi cloud a consumo, è facile veder lievitare i costi a causa di configurazioni migliorabili.
Nginx (ne abbiamo già parlato come proxy per web application) è un web server open source noto per la sua efficienza, affidabilità e scalabilità. Tra le sue numerose funzionalità, Nginx si distingue per le sue capacità avanzate di load balancing, che lo rendono una scelta ideale per distribuire il traffico su più server e massimizzare le prestazioni di un sito o di un’applicazione web.
Con Nginx è possibile realizzare il proprio Load Balancer con i seguenti vantaggi:
La configurazione di Nginx come load balancer è relativamente semplice e può essere effettuata tramite la modifica del file di configurazione nginx.conf.
Questo è un esempio di file di configurazione di Nginx che può essere utilizzato come load balancer per distribuire il traffico su due server web:
# upstream backend
upstream backend {
server server1.example.com:80 weight=2;
server server2.example.com:80 weight=1;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Spiegazione del file di configurazione:
upstream backend
: definisce un upstream chiamato backend
che contiene due server web: server1.example.com
e server2.example.com
.
Il parametro weight
indica il peso di ciascun server nella distribuzione del traffico.
In questo caso, server1.example.com
riceverà il doppio del traffico rispetto a server2.example.com
.
server
: Definisce un server web che ascolta sulla porta 80 e serve il nome di dominio example.com
.
location /
: Definisce una location, una route, che cattura tutte le richieste inviate al server web.
proxy_pass http://backend
: Indica che Nginx deve inoltrare le richieste all’upstream backend
.
proxy_set_header Host $host
: Imposta l’intestazione HTTP Host
all’interno della richiesta inoltrata con il nome di dominio della richiesta originale.
proxy_set_header X-Real-IP $remote_addr
: Imposta l’intestazione HTTP X-Real-IP
all’interno della richiesta inoltrata con l’indirizzo IP reale del client.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
: Aggiunge o aggiorna l’intestazione HTTP X-Forwarded-For
con l’indirizzo IP del proxy all’interno della richiesta inoltrata .
Questo è solo un esempio di base e la configurazione di Nginx come load balancer può essere adattata alle esigenze specifiche del progetto web.
Consigliamo di consultare la documentazione ufficiale di Nginx e di adattare la configurazione alle specifiche esigenze di progetto.