HAProxy est un outil open source d'équilibrage de charge et de services proxy haute disponibilité pour les applications réseau TCP et HTTP. Il est facile à utiliser, convient aux sites Web à volume élevé et s'intègre parfaitement dans les architectures existantes. Il offre des connexions transparentes, le déchargement du serveur, l'application de politiques, limite les connexions en dehors de sa fonction principale de service proxy. Dans cet article, nous expliquons comment configurer haproxy dans Ubuntu 16.04.
1. Configurer le réseau
Nous ajouterons trois serveurs Web fonctionnant avec Apache2 et un serveur HAPROXY qui proxy toutes les requêtes/réponses des trois services Web de notre réseau.
Les listes suivantes répertorient les détails du serveur Web dans notre réseau.
Server 1: site1.local 10.0.1.116
Server 2: site2.local 10.0.1.117
Server 3: site3.local 10.0.1.119
Serveur HAProxy :
load-balancer.local 10.0.1.118
Nous allons également attacher une adresse IP publique à load-balancer.local afin d'y accéder depuis le domaine public (facultatif). Si vous ne souhaitez pas y accéder depuis le domaine public, vous pouvez ignorer l'attachement de l'adresse IP publique en supposant que vous accéderez au serveur proxy de votre réseau.
2. Configurer le nom d'hôte
Puisque nous allons accéder à l'équilibreur de charge et au serveur Web par leur nom (et non par IPADDRESS), nous allons donc configurer le nom d'hôte de trois serveurs Web et d'un serveur proxy. Nous allons configurer le nom d'hôte de trois serveurs Web et du serveur proxy comme site1.local, site2.local, site3.local et load-balancer.local respectivement.
Nous allons configurer le nom d'hôte de 10.0.1.116 en tant que site1.local dans /etc/hosts et /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
Redémarrer le réseau
root@site1:~# service networking restart
Installez apache et activez-le.
root@site1:~# apt-get install apache2
root@site1:~# service apache2 enable
root@site1:~# service apache2 start
Créer un fichier d'index pour 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>
Ajouter une règle de pare-feu pour http
# ufw allow 80/tcp
# ufw reload
Vérifiez maintenant si vous pouvez accéder au site1
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
OU
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>
Répétez l'étape 2 pour site2 ( 10.0.1.117 ) et site3 ( 10.0.1.119 ).
Dans le serveur proxy, ajoutez les trois entrées de serveurs Web (IPADDRESS HOSTNAME) en plus de son propre nom d'hôte en tant que 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
Configurer le nom d'hôte du serveur proxy
root@load-balancer:~# vi /etc/hostname
load-balancer.local
3. Installer HAProxy
Avant de l'installer, mettez à jour Ubuntu. Exécutez la commande suivante en tant que root ou en utilisant sudo pour mettre à jour Ubuntu.
root@load-balancer:~# apt-get update
Maintenant, mettez à jour les packages sur le système.
root@load-balancer:~# apt-get upgrade
Installez-le en exécutant la commande suivante dans le terminal.
root@load-balancer:~# apt-get install haproxy
Pour activer le service en tant que démon, modifiez /etc/defaults/haproxy et ajoutez la ligne suivante.
ACTIVÉ=1
root@load-balancer:~# vi /etc/defaults/haproxy
ENABLED=1
# Add extra flags here
#EXTRAOPTS="-de -m 16"
Démarrer le service
root@load-balancer:~# service haproxy start
4. Configurer HAProxy
Le fichier de configuration situé dans /etc/haproxy/haproxy.cfg et comporte deux parties global et proxies, la section Global définit les paramètres à l'échelle du processus et la section proxy se compose des sections defaults, listen, front-end et back-end.
Editez le fichier de configuration avec l'éditeur de texte vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
Le fichier de configuration par défaut ressemblera à ce qui suit. Conservez la section globale et par défaut telle quelle.
Section 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
Section par défaut
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
Ajout d'un écouteur :
Une section "front end" décrit un ensemble de sockets d'écoute acceptant les connexions client. Le front-end définit comment les requêtes doivent être traitées et envoyées au serveur back-end :
frontend Local_Server
bind 10.0.1.118:80
mode http
default_backend My_Web_Servers
Ajout de serveurs Web principaux :
Une section "back-end" décrit un ensemble de serveurs auxquels le proxy se connectera pour transférer les connexions entrantes. Selon la configuration ci-dessus, l'équilibreur de charge écoute maintenant sur le port 80. Définissez maintenant les serveurs Web principaux auxquels il enverra la demande.
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
Vous pouvez ajouter le paramètre "vérifier" à la fin des trois lignes ci-dessus pour vérifier le paramètre de santé de vos serveurs Web.
Vous pouvez utiliser un autre algorithme d'équilibrage en fonction de vos besoins.
Leastconn
Sélectionne le serveur avec le moins de connexions -- il est recommandé pour les sessions plus longues. Les serveurs du même backend sont également alternés selon un mode round robin.
Source
Cela sélectionne le serveur à utiliser en fonction d'un hachage de l'adresse IP source, c'est-à-dire l'adresse IP de votre utilisateur. C'est une méthode pour s'assurer qu'un utilisateur se connectera au même serveur.
Activer les statistiques (facultatif)
Maintenant, si vous le souhaitez, vous pouvez activer les statistiques en ajoutant ce qui suit dans le fichier de configuration.
listen stats
bind :9000
stats enable
stats hide-version
stats refresh 20s
stats show-node
stats uri /stats
5. Redémarrez HAProxy
Puisque vous avez terminé avec toutes les configurations nécessaires pour le serveur proxy, vérifiez le fichier de configuration avant de redémarrer le service à l'aide de la commande suivante.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Si la commande ci-dessus a renvoyé la sortie comme "le fichier de configuration est valide", redémarrez le service HAProxy
root@load-balancer:~# service haproxy restart
Vérifiez maintenant l'état du serveur HAProxy.
root@load-balancer:~# service haproxy status
6. Tester HAProxy
Avant de tester, assurez-vous que vous pouvez envoyer un ping au serveur Web (site1.local, site2.local, site3.local) à partir de 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
Tester HAPROXY avec CURL
Pour tester l'exécution du script suivant à partir du terminal, vous constaterez que l'équilibreur de charge envoie une demande à trois serveurs Web dans une méthode de tourniquet.
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>
...............................
...............................
...............................
Tester dans le navigateur :
Pointez votre navigateur sur http://load-balancer.local ou http://Server-Public-IP, vous obtiendrez une réponse de trois serveurs Web de manière circulaire confirmant qu'il fonctionne conformément à nos attentes. À chaque actualisation, le serveur proxy envoie une par une les requêtes au serveur Web principal.
Vous pouvez également visiter l'URL des statistiques qui est configurée dans la dernière section du fichier de configuration pour confirmer que les ports sont ouverts au trafic. Naviguez simplement vers Public IP ou http://load-balancer.local sur le port 9000.
Par exemple, accédez à http://load-balancer.local:9000/stats
Vous pouvez également surveiller l'état du serveur à partir du terminal à l'aide de HATOP. HATOP est un outil tiers qui extrait les statistiques d'un fichier socket créé par l'équilibreur de charge. Installez HATOP en exécutant la commande suivante depuis le terminal.
root@load-balancer:~# apt-get install hatop
Normalement, lors de l'exécution de HATOP, vous devez utiliser le paramètre -s avec la commande sudo hatop -s /var/run/haproxy.sock. Pour éviter d'avoir à saisir le paramètre -s lors de l'appel à HATOP, vous pouvez insérer la ligne suivante dans votre fichier ~/.bashrc :
exporter unix-socket=/var/run/haproxy.sock
7. Journalisation de HAProxy
Modifiez /etc/rsyslog.d/haproxy.conf et ajoutez-y les lignes suivantes.
local0.* -/var/log/haproxy_0.log
local1.* -/var/log/haproxy_1.log
Redémarrez rsyslog
root@load-balancer:~# service rsyslog restart
Vérifiez maintenant les journaux à l'aide de la commande suivante
root@load-balancer:~# tail -f /var/log/haproxy*.log
Ajoutez également la ligne "debug" dans la section globale du fichier de configuration pour la journalisation détaillée.
Conclusion
Avec HAProxy, vous pouvez augmenter les performances et la disponibilité de votre application Web. Ce didacticiel n'est qu'une introduction à l'équilibrage de charge bien qu'il soit capable de faire bien plus que ce qui est décrit dans ce didacticiel. Vous pouvez améliorer la haute disponibilité en configurant une adresse IP flottante entre plusieurs équilibreurs de charge pour vous protéger contre les pannes dans un seul équilibreur de charge.