Per garantire la massima disponibilità, scalabilità e prestazioni delle applicazioni web, è ora comune implementare tecnologie che introducono la ridondanza, come il clustering dei server e il bilanciamento del carico. Ad esempio, configurando un cluster di server che eseguono tutti le stesse applicazioni e quindi distribuendo il traffico attraverso bilanciatori di carico.
HAProxy è un bilanciatore di carico open source, potente, ad alte prestazioni, affidabile, sicuro e ampiamente utilizzato per l’alta disponibilità dei server TCP/HTTP, server proxy e terminatore SSL/TLS costruito per siti web ad alto traffico. Funziona in modo affidabile su Linux, Solaris, FreeBSD, OpenBSD e sui sistemi operativi AIX.
Questa guida mostra come configurare un bilanciatore di carico ad alta disponibilità dedicato con HAProxy su CentOS 8 per controllare il traffico in un cluster di server web NGINX. Mostra anche come configurare la terminazione SSL/TLS in HAProxy.
Prerequisiti:
A total of 4 servers with minimal CentOS 8 installation.
Configurazione dell’ambiente di test
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247 Test Site Domain: www.tecmint.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
Passo 1: Configurazione del server HTTP Nginx sulle macchine client
1. Accedi a tutte le tue macchine client CentOS 8 e installa il server web Nginx utilizzando il gestore di pacchetti dnf come mostrato.
# dnf install Nginx
2. Successivamente, avvia il servizio Nginx, attualmente lo impostiamo per avviarsi automaticamente all’avvio del sistema e confermiamo che sia in esecuzione controllando il suo stato utilizzando i comandi systemctl (eseguite questa operazione su tutti i client).
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3. Inoltre, se il servizio firewalld è in esecuzione su tutti i client (puoi controllare questo eseguendo systemctl start firewalld), devi aggiungere i servizi HTTP e HTTPS nella configurazione del firewall per consentire le richieste dal load balancer a superare il firewall ai web server Nginx. Poi ricarica il servizio firewalld per applicare le nuove modifiche (eseguite questa operazione su tutti i client).
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
4. Successivamente, apri un browser web sul tuo computer locale e verifica se l’installazione di Nginx funziona bene. Usa l’IP client per navigare, una volta che vedi la pagina di test di Nginx, significa che il web server installato sul client è funzionante correttamente.

5. Successivamente, occorre creare pagine di test sul client che userai in seguito per testare la configurazione di HAProxy.
----------- Web Server #1 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #2 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #3 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html
Passo 2: Installazione e configurazione del server HAProxy su CentOS 8
6. Ora installa il pacchetto HAProxy sul server HAProxy eseguendo il seguente comando.
# dnf install haproxy
7. Successivamente, avvia il servizio HAProxy, abilita l’avvio automatico al boot del sistema e verifica lo stato.
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy

8. Ora configuriamo HAProxy utilizzando il seguente file di configurazione.
# vi /etc/haproxy/haproxy.cfg
Il file di configurazione è diviso in quattro sezioni principali.
- Impostazioni globali – imposta i parametri per tutto il processo.
- Predefiniti – questa sezione imposta i parametri predefiniti per tutte le altre sezioni successive alla sua dichiarazione.
- Frontend – questa sezione descrive una serie di socket in ascolto che accettano le connessioni dei clienti.
- Backend – questa sezione descrive una serie di server ai quali il proxy si connetterà per inoltrare le connessioni in ingresso.
Per capire le opzioni sotto impostazioni globali e predefiniti, leggi la documentazione di HAProxy (il link è fornito alla fine dell’articolo). Per questa guida, utilizzeremo le impostazioni predefinite.
Configurazione del logging di HAProxy
9. HAProxy, una volta distribuito, svolgerà un ruolo significativo nella tua infrastruttura IT, quindi la configurazione del logging è un requisito di base; questo ti permette di ottenere informazioni su ogni connessione ai tuoi server web di backend.
Il parametro di registro ( log parameter ) (evidenziato nella seguente schermata) dichiara un server Syslog globale (come rsyslog , predefinito in CentOS) che riceverà i messaggi di log. Qui è possibile dichiarare più di un server.
La configurazione predefinita punta a localhost ( 127.0.0.1 ) e local2 è il codice di servizio predefinito utilizzato per identificare i messaggi di log di HAProxy in rsyslog .

10. Successivamente, è necessario indicare al server rsyslog come ricevere e elaborare i messaggi di log di HAProxy . Aprire il file di configurazione di rsyslog in /etc/rsyslog.conf o creare un nuovo file all’interno della directory /etc/rsyslog.d , ad esempio /etc/rsyslog.d/haproxy.conf .
# vi /etc/rsyslog.d/haproxy.conf
Copiare e incollare la seguente configurazione per raccogliere il log con UDP sulla porta predefinita 514 .
$ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514
Aggiungere anche queste righe per istruire rsyslog a scrivere su due file di log separati in base alla gravità, dove local2 è il codice di servizio definito nella configurazione di HAProxy sopra.
local2.* /var/log/haproxy-traffic.log local2.notice /var/log/haproxy-admin.log
11. Salva il file e chiudilo. Quindi riavviare il servizio rsyslog per applicare le modifiche recenti.
# systemctl restart rsyslog
Configurazione di HAProxy Front-end e back-end.
12. In questa sezione, dimostreremo come configurare i proxy front-end e back-end. Tornate al file di configurazione di HAProxy e modificate le sezioni predefinite front-end e back-end come segue. Non entreremo in una spiegazione dettagliata di ciascun parametro, potete sempre fare riferimento alla documentazione ufficiale.
La seguente configurazione definisce una sezione listen utilizzata per servire la pagina HAProxy Stats. Il parametro bind assegna un listener a un dato indirizzo IP (*
in questo caso) e porta (9000).
Il parametro enable abilita la pagina delle statistiche che verrà accessibile utilizzando l’URI /stats (cioè http://indirizzo_server:9000/stats
).
Il parametro auth viene utilizzato per aggiungere un’autenticazione di base durante l’accesso alla pagina (sostituire haproxy e Lostp@1ss con un nome utente e una password a vostra scelta).
listen stats bind *:9000 stats enable stats hide-version stats uri /stats stats admin if LOCALHOST stats auth haproxy:Lostp@1ss
13. La prossima configurazione definisce una sezione front-end chiamata TL (potete dare un nome a vostra scelta). Il parametro mode definisce la modalità in cui HAProxy opera.
Il parametro acl (Access Control List) viene utilizzato per prendere una decisione basata sul contenuto estratto dalla richiesta. In questo esempio, la richiesta viene considerata semplice HTTP se non viene effettuata tramite SSL.
Quindi viene utilizzata l’impostazione http-request set-header per aggiungere un’intestazione HTTP alla richiesta. Questo aiuta a informare Nginx che la richiesta iniziale è stata effettuata tramite HTTP (o tramite la porta 80).
La direttiva default_backend o use_backend definisce i server di backend, in questo caso indicati da TL_web_servers.
Si noti che HAProxy restituirà un errore “503 Service Unavailable” se una richiesta non viene instradata da una direttiva use_backend o default_backend.
frontend TL bind *:80 mode http acl http ssl_fc,not http-request set-header X-Forwarded-Protocol http if http default_backend TL_web_servers
14. Quindi è necessario definire una sezione backend in cui l’impostazione balance definisce come HAProxy seleziona i server di backend per elaborare una richiesta se nessun metodo di persistenza sovrascrive tale selezione.
La direttiva cookie abilita la persistenza basata sui cookie, istruisce HAProxy ad inviare un cookie chiamato SERVERID al client e ad associarlo all’ID del server che ha inviato la risposta iniziale.
La direttiva server viene utilizzata per definire i server di upstream nel formato nome_server (ad es. websrv1), server_IP:porta e opzioni.
Una delle opzioni principali è check che indica ad HAProxy di continuare a verificare la disponibilità di un server e di segnalarlo nella pagina delle statistiche.
backend TL_web_servers mode http balance roundrobin option httpchk HEAD / cookie SERVERUID insert indirect nocache server websrv1 10.42.0.200:80 cookie websrv1 check server websrv2 10.42.0.21:80 cookie websrv2 check server websrv3 10.42.0.34:80 cookie websrv3 check
Commentare le altre sezioni di frontend e backend come mostrato nello screenshot che segue. Salvare il file e chiuderlo.

15. Ora riavviare il servizio HAProxy per applicare le nuove modifiche.
# systemctl restart haproxy
16. Successivamente, assicurarsi che i servizi HTTP (porta 80) e HTTPS (porta 433) siano aperti nel firewall per accettare le richieste dei client come segue. Aprire anche la porta 9000 nel firewall per accedere alla pagina delle statistiche e ricaricare le impostazioni del firewall.
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent –add-service=https # firewall-cmd --zone=public --permanent --add-port=9000/tcp # firewall-cmd --reload
Fase 3: Test della configurazione di HAProxy e visualizzazione delle statistiche
17. Ora è il momento di testare la configurazione di HAPrxoy. Sul computer desktop locale da cui si accedono tutti i server, aggiungere la seguente riga nel file /etc/hosts per consentire di utilizzare il dominio del sito fittizio.
10.42.0.247 www.tecmint.lan
18. Successivamente aprire un browser e navigare utilizzando l’indirizzo del server o il dominio del sito.
http://10.42.0.247/ OR http://www.tecmint.lan/

19. Per accedere alla pagina delle statistiche di HAProxy, utilizzare il seguente indirizzo.
http://10.42.0.247:9000/stats
Poi utilizzare il nome utente e la password definiti nel file di configurazione di HAProxy (fare riferimento al parametro stats auth).

Dopo un accesso riuscito, verrai reindirizzato alla pagina di statistica di HAProxy che ti mostra metriche che coprono la salute dei tuoi server, i tassi di richiesta attuali, i tempi di risposta e molto altro ancora.
Per mostrare come funziona il report di stato riguardo ai codici colore, abbiamo messo uno dei server di back-end.

Passaggio 4: Configurare HTTPS in HAProxy Utilizzando un Certificato SSL Autenticato
20. In questa sezione finale, dimostreremo come configurare SSL/TLS per proteggere tutte le comunicazioni tra il server HAProxy e il client. HAProxy supporta quattro principali modalità di configurazione HTTPS, ma per questa guida useremo lo scarico SSL/TLS.
Nella modalità di scarico SSL/TLS, HAProxy decifra il traffico sul lato client e si connette in modo trasparente ai server di back-end.
Inizieremo creando il certificato e la chiave come mostrato (rispondi alle domande in base ai dettagli della tua azienda durante la creazione del certificato, come evidenziato nello screenshot).
# mkdir /etc/ssl/tecmint.lan # cd /etc/ssl/tecmint.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt # cd /etc/ssl/tecmint.lan/ # cat tecmint.crt tecmint.key >tecmint.pem # ls -l

21. Successivamente, apri il file di configurazione di HAProxy (/etc/haproxy/haproxy.cfg) e modifica la sezione front-end.
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem redirect scheme https if !{ ssl_fc } mode http acl http ssl_fc,not acl https ssl_fc http-request set-header X-Forwarded-Protocol http if http http-request set-header X-Forwarded-Protocol https if https default_backend TL_web_servers

Salva il file e chiudilo.
22. Quindi riavvia il servizio HAProxy per applicare le nuove modifiche.
# systemctl restart haproxy.service
23. Successivamente, apri un browser web e prova ad accedere nuovamente al sito. Il browser mostrerà un errore a causa del certificato autenticato, fai clic su Avanzate per procedere.



Questo è tutto per ora! Ogni applicazione web ha il proprio insieme di requisiti, è necessario progettare e configurare il bilanciamento del carico per adattarlo all’infrastruttura IT e ai requisiti dell’applicazione.
Per ottenere ulteriori approfondimenti su alcune delle opzioni di configurazione utilizzate in questa guida e in generale su come utilizzare HAProxy, consultare la documentazione ufficiale della versione comunitaria di HAProxy o della versione enterprise di HAProxy. È possibile inviare domande o pensieri tramite il modulo di feedback qui sotto.
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/