Come configurare HAProxy come bilanciatore di carico per Nginx su CentOS 8

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.

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

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 .

HAProxy Default Log Parameter

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.

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

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).

HAProxy Stats Login Page

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.

HAProxy Statistics Report

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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

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.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

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/