HAProxy è uno strumento open source di bilanciamento del carico e servizi proxy ad alta disponibilità per applicazioni di rete basate su TCP e HTTP. È facile da usare, adatto per siti Web ad alto volume e la sua perfetta integrazione nelle architetture esistenti. Offre connessioni trasparenti, offload del server, applicazione delle politiche, limitazione delle connessioni oltre alla sua funzione principale di servizio proxy. In questo articolo spieghiamo come configurare haproxy in Ubuntu 16.04.
1. Configura rete
Aggiungeremo tre server Web in esecuzione con Apache2 e un server HAPROXY che eseguirà il proxy di tutte le richieste/risposte dei tre servizi Web nella nostra rete.
Di seguito sono elencati i dettagli del server Web nella nostra rete.
Server 1: site1.local 10.0.1.116
Server 2: site2.local 10.0.1.117
Server 3: site3.local 10.0.1.119
Server HAProxy:
load-balancer.local 10.0.1.118
Allegheremo anche un IP pubblico a load-balancer.local in modo da accedervi da dominio pubblico (opzionale). Se non desideri accedervi dal dominio pubblico, puoi saltare l'allegato dell'IP pubblico supponendo che accederai al server proxy all'interno della tua rete.
2. Configura nome host
Dal momento che accederemo al sistema di bilanciamento del carico e al server Web tramite il loro nome (non tramite IPADDRESS), imposteremo il nome host di tre server Web e un server proxy. Imposteremo il nome host di tre server Web e server proxy rispettivamente come site1.local, site2.local, site3.local e load-balancer.local.
Imposteremo il nome host di 10.0.1.116 come site1.local in /etc/hosts e /etc/hostname
root@site1:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.116 site1.local
root@site1:~# vi /etc/hostname
site1.local
Riavvia la rete
root@site1:~# service networking restart
Installa Apache e abilitalo.
root@site1:~# apt-get install apache2
root@site1:~# service apache2 enable
root@site1:~# service apache2 start
Crea un file di indice per site1.local
root@site1:~# vi /var/www/html/index.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Aggiungi la regola del firewall per http
# ufw allow 80/tcp
# ufw reload
Ora controlla se puoi accedere al sito1
root@site1:~# curl -I site1.local
HTTP/1.1 200 OK
Date: Sun, 14 Aug 2016 14:30:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Sun, 14 Aug 2016 03:50:35 GMT
ETag: "ec-53a0004a26c6d"
Accept-Ranges: bytes
Content-Length: 236
Vary: Accept-Encoding
Content-Type: text/html
O
root@site1:~# curl site1.local
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Ripeti il passaggio 2 per site2 ( 10.0.1.117 ) e site3 ( 10.0.1.119 ).
Nel server proxy aggiungi tutte e tre le voci dei server Web (IPADDRESS HOSTNAME) oltre al proprio nome host come load-balancer.local
root@load-balancer:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.118 load-balancer.local
10.0.1.116 site1.local
10.0.1.117 site2.local
10.0.1.119 site3.local
Imposta il nome host del server proxy
root@load-balancer:~# vi /etc/hostname
load-balancer.local
3. Installa HAProxy
Prima di installarlo aggiorna Ubuntu. Esegui il comando seguente come root o usando sudo per aggiornare Ubuntu.
root@load-balancer:~# apt-get update
Ora aggiorna i pacchetti sul sistema.
root@load-balancer:~# apt-get upgrade
Installalo eseguendo il seguente comando nel terminale.
root@load-balancer:~# apt-get install haproxy
Per abilitare il servizio come demone, modificare /etc/defaults/haproxy e aggiungere la riga seguente.
ABILITATO=1
root@load-balancer:~# vi /etc/defaults/haproxy
ENABLED=1
# Add extra flags here
#EXTRAOPTS="-de -m 16"
Avvia il servizio
root@load-balancer:~# service haproxy start
4. Configura HAProxy
Il file di configurazione si trova in /etc/haproxy/haproxy.cfg e ha due parti globali e proxy, la sezione Global imposta parametri a livello di processo e la sezione proxy è composta dalle sezioni default, listen, front-end e back-end.
Modifica il file di configurazione con l'editor di testo vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
Il file di configurazione predefinito sarà simile al seguente. Mantieni la sezione globale e predefinita così com'è.
Sezione globale
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH
+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
Sezione predefinita
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
Aggiunta di ascoltatore:
Una sezione "front end" descrive un insieme di socket in ascolto che accettano connessioni client. Il front-end definisce come le richieste devono essere gestite e inviate al server back-end:
frontend Local_Server
bind 10.0.1.118:80
mode http
default_backend My_Web_Servers
Aggiunta di server Web back-end:
Una sezione "back-end" descrive un insieme di server a cui si connetterà il proxy per inoltrare le connessioni in entrata. Come indicato sopra, il bilanciamento del carico di configurazione è ora in ascolto sulla porta 80. Ora definisci i server Web back-end a cui invierà la richiesta.
backend My_Web_Servers
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server site1.local 10.0.1.116:80
server site2.local 10.0.1.117:80
server site3.local 10.0.1.119:80
Puoi aggiungere il parametro "check" alla fine delle tre righe sopra per controllare il parametro di salute dei tuoi server web.
Puoi utilizzare un altro algoritmo di bilanciamento a seconda delle tue esigenze.
Leastconn
Seleziona il server con il minor numero di connessioni:è consigliato per sessioni più lunghe. Anche i server nello stesso backend vengono ruotati in modo round robin.
Fonte
Questo seleziona quale server utilizzare in base a un hash dell'IP di origine, ovvero l'indirizzo IP dell'utente. Questo è un metodo per garantire che un utente si connetta allo stesso server.
Abilita statistiche (facoltativo)
Ora se vuoi puoi abilitare le statistiche aggiungendo il seguito nel file di configurazione.
listen stats
bind :9000
stats enable
stats hide-version
stats refresh 20s
stats show-node
stats uri /stats
5. Riavvia HAProxy
Poiché hai eseguito tutte le configurazioni necessarie per il server proxy, verifica il file di configurazione prima di riavviare il servizio utilizzando il seguente comando.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Se il comando precedente ha restituito l'output come "il file di configurazione è valido", riavviare il servizio HAProxy
root@load-balancer:~# service haproxy restart
Ora controlla lo stato del server HAProxy.
root@load-balancer:~# service haproxy status
6. Prova HAProxy
Prima di eseguire il test, assicurati di poter eseguire il ping del server web ( site1.local, site2.local, site3.local) da load-balancer.local
root@load-balancer:~# ping site1.local
PING site1.local (10.0.1.116) 56(84) bytes of data.
64 bytes from site1.local (10.0.1.116): icmp_seq=1 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=2 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=3 ttl=64 time=0.648 ms
root@load-balancer:~# ping site2.local
PING site2.local (10.0.1.117) 56(84) bytes of data.
64 bytes from site2.local (10.0.1.117): icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=2 ttl=64 time=0.687 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=3 ttl=64 time=0.778 ms
root@load-balancer:~# ping site3.local
PING site3.local (10.0.1.119) 56(84) bytes of data.
64 bytes from site3.local (10.0.1.119): icmp_seq=1 ttl=64 time=0.830 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=3 ttl=64 time=0.771 ms
Testa HAPROXY utilizzando CURL
Per eseguire il test, esegui il seguente script dal terminale , scoprirai che il sistema di bilanciamento del carico sta inviando una richiesta a tre server Web in un metodo round robin.
root@load-balancer:~# while true; do curl http://10.0.1.118; sleep 1; done
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
...............................
...............................
...............................
Test nel browser:
Punta il tuo browser su http://load-balancer.local o http://Server-Public-IP, riceverai una risposta da tre server Web in modo round robin confermando che funziona secondo le nostre aspettative. Ad ogni aggiornamento, il server proxy invia le richieste al server Web back-end una per una.
Puoi anche visitare l'URL delle statistiche che è configurato nell'ultima sezione del file di configurazione per confermare che le porte sono aperte al traffico. Basta passare a IP pubblico o http://load-balancer.local sulla porta 9000.
Ad esempio, vai a http://load-balancer.local:9000/stats
È inoltre possibile monitorare lo stato del server dal terminale utilizzando HATOP. HATOP è uno strumento di terze parti che estrae le statistiche da un file socket creato da Load Balancer. Installa HATOP eseguendo il seguente comando dal terminale.
root@load-balancer:~# apt-get install hatop
Normalmente quando si esegue HATOP, è necessario utilizzare il parametro -s con il comando sudo hatop -s /var/run/haproxy.sock. Per evitare di dover inserire il parametro -s quando chiami HATOP, puoi inserire la seguente riga nel tuo file ~/.bashrc:
export unix-socket=/var/run/haproxy.sock
7. Registrazione di HAProxy
Modifica /etc/rsyslog.d/haproxy.conf e aggiungi le seguenti righe.
local0.* -/var/log/haproxy_0.log
local1.* -/var/log/haproxy_1.log
Riavvia rsyslog
root@load-balancer:~# service rsyslog restart
Ora controlla i log usando il seguente comando
root@load-balancer:~# tail -f /var/log/haproxy*.log
Aggiungi anche la riga "debug" nella sezione globale del file di configurazione per la registrazione dettagliata.
Conclusione
Con HAProxy, puoi aumentare le prestazioni e la disponibilità della tua applicazione web. Questo tutorial è solo un'introduzione al bilanciamento del carico, sebbene sia in grado di fare molto di più di quanto descritto in questo tutorial. Puoi migliorare l'elevata disponibilità configurando IP mobile tra più sistemi di bilanciamento del carico per proteggere dai guasti in un unico sistema di bilanciamento del carico.