Bonjour à tous, dans ce nouveau tutoriel consacré à la haute disponibilité, je vais vous parler d’ HaProxy :)
Qu’est-ce que HaProxy?
Développée par le français Willy Tarreau en 2002, HAProxy est une solution libre, fiable et très performante de répartition de charge de niveau 4 (TCP) et 7 (HTTP).
Elle est particulièrement adaptée aux sites web fortement chargés qui nécessitent de la disponibilité.
Dans ce tutoriel, nous allons mettre en place trois serveurs
- Un serveur de répartition de charge avec HaProxy
- Deux serveurs web avec Apache et PHP
Voici la topologie que nous allons mettre en place:
Notice
Dans Virtualbox, le réseau en 192.168.2.XXX est mon réseau local (mode pont) et pour le réseau en 10.1.0.XXX la configuration de la carte est en mode Réseau interne.Important!
Les serveurs sont configurés de la façon suivante:
Serveur de répartition de charge
hostname: lb
Deux carte réseaux
eth0: 192.168.2.100
eth1: 10.1.0.1
Serveurs Web
Serveur web1
hostname: web1
eth0: 10.1.0.21
Serveur web2
hostname: web2
eth0: 10.1.0.22
Installation du Load Balancer.
Une fois les cartes réseau de notre serveur de répartition de charge configurés correctement, nous allons pouvoir installer et configurer HaProxy.
Config IP du serveur
# The primary network interface auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.2.100 netmask 255.255.255.0 gateway 192.168.2.1 auto eth1 iface eth1 inet static address 10.1.0.1 netmask 255.255.255.0
Malheureusement, HaProxy n’est pas dans les dépôts principaux de Debian, nous allons devoir utiliser les dépôts Backports pour l’installer.
echo "deb http://ftp.debian.org/debian/ wheezy-backports main" >> /etc/apt/sources.list apt-get update apt-get install haproxy
Une fois l’installation terminée, nous devons éditer la valeur ENABLED=0 à ENABLED=1 dans les fichiers /etc/default/haproxy et /etc/init.d/haproxy.
Vouc pouvez le faire avec les commandes suivantes:
sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy
Configuration de HaProxy
La configuration de HaProxy est assez simple et se fait dans un seul fichier de configuration, ce fichier se trouve dans /etc/haproxy/haproxy.cfg.
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull contimeout 5000 clitimeout 50000 srvtimeout 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 #Configuration du balancement listen cluster_web 192.168.2.100:80 #Web mode http #Mode de balancement Round Robin balance roundrobin #Options option httpclose option forwardfor #Les serveurs Web server web1 10.1.0.21:80 check server web2 10.1.0.22:80 check #Stats stats enable stats hide-version stats refresh 30s stats show-node stats auth admin:admin stats uri /stats
Je vais analyser ce fichier de configuration:
listen cluster_web 192.168.2.100:80: Cette directive nous permet de spécifier sur quelle adresse IP HaProxy va fonctionner, nous allons accéder au contenu web depuis cette adresse IP.
mode http: permet de spécifier que le balancement de charge est utilisé pour du contenu web http, dans le cas contraire on peut utiliser le mode tcp (pour du myql par exemple ;) )
balance roundrobin: permet de spécifier l’algorithme de répartitionde charge. Il en existe plusieurs
- RoundRobin: La méthode Round-robin est une répartition équitable de la charge entre les serveurs d’un cluster. Chaque serveur traite le même nombre de requêtes, mais cela nécessite d’avoir des serveurs homogènes en termes de capacité de traitement.
- Source: Le mode de balancement « source » signifie qu’un client en fonction de son adresse IP sera toujours dirigé vers le même serveur web. Cette option est nécessaire lorsque les sites Internet utilisent des sessions PHP.
- Least connection: Le serveur renvoie vers le serveur le moins chargé. Si en théorie il semble le plus adapté, en réalité dans le cadre du Web dynamique, un serveur peut être considéré comme chargé alors que les processus sont en attente d’une requête vers une base de données.
- First Response: Les requêtes clients sont envoyées simultanément à tous les serveurs et le premier qui répond sera chargé de la connexion. Difficile à mettre en oeuvre et rarement employé.
server web1 10.1.0.21:80 check: permet déclarer les différents serveurs web qui vont êtres utilisé pour la répartitiont de charge
Enfin stats, permet de configurer la page de statistiques de HaProxy, dans cette configuration,la page de statistiques sera disponibles via l’adresse suivante http://192.168.2.100/stats avec les identifiants admin/admin.
Maintenant vous pouvez enregistrer le fichier et démarrez Haproxy avec la commande suivante:
/etc/init.d/haproxy start
Vous pouvez maintenant accéder à l’interface de statistiques de HaProxy via l’addresse: http://192.168.2.100/stats
Vous pouvez voir sur l’image suivante que les deux serveurs Web sont affichés comme DOWN, c’est normal parce que nous ne les avons pas encore configurés.
Avant de mettre en place les serveurs Web, nous allons mettre en place l’IP forwarding sur le serveur LB pour que les serveurs Web aient accès à internet et aussi quelques rêgles iptables por mettre en place du NAT afin de pouvoir accéder aux serveurs Web via SSH.
Créer un fichier firewall dans le dossier /etc/init.d/ et copiez ceci dedans:
#!/bin/bash ##Denis ROSENKRANZ ##denisrosenkranz.com start() { echo -n "Application des regles IpTables: " #Suppresion des anciennes rêgles iptables -F iptables -X iptables -t nat -F #Activation de l'IP Forwardings echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ##NAT pour SSH sur les Web #Web iptables -t nat -A PREROUTING -p tcp -d 192.168.2.100 --dport 2221 -j DNAT --to-destination 10.1.0.21:22 iptables -t nat -A PREROUTING -p tcp -d 192.168.2.100 --dport 2222 -j DNAT --to-destination 10.1.0.22:22 echo " [terminé]" echo } stop() { echo -n "Flush des regles IpTables: " iptables -F iptables -X iptables -t nat -F echo " [termine]" echo } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) /sbin/iptables -L /sbin/iptables -t nat -L ;; *) echo "Usage: firewall {start|stop|restart|status}" esac exit
Enregistrez le fichier et faites les commandes suivantes afin de rendre le fichier exécutable et de pouvoir le lancer au démarrage:
chmod +x /etc/init.d/firewall update-rc.d firewall defaults
Puis mettez en place les règles
/etc/init.d/firewall start
Configuration des serveurs web.
Maintenant que le serveur est configuré, nous allons pouvoir commencer à configurer les serveurs Web.
En ce qui concerne les adresses des deux serveurs Web, n’oubliez pas d’utiliser comme passerelle l’IP du serveur haproxy.
Voici la configuration IP de web1:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 allow-hotplug eth0 iface eth0 inet static address 10.1.0.21 netmask 255.255.255.0 gateway 10.1.0.1
Si web1 et web2 sont bien configurée, vous pouvez maintenant accéder à ces serveurs via SSH
- ssh root@192.168.2.100 -p 2221 pour web1
- ssh root@192.168.2.100 -p 2222 pour web2
Une fois sur ces deux serveurs, vous pouvez installer apache et PHP avec la commande suivante:
apt-get install apache2 php5
Une fois l’installation de apache et PHP terminée sur les deux serveurs, accédez à http://192.168.2.100/stats et vous verrez maintenant que tout est vert. Cela veut dire que HaProxy fonctionne maintenant.
Vous pouvez accéder maintenant à http://192.168.2.100 et vous verrez la page par défaut d’Apache, mais vous ne savez pas sur quel serveur Web vous êtes.
Test de la répartition de charge
Pour tester que la répartition de charge fonctionne, nous allons créer une page en PHP sur les deux serveurs web, cette page affichera le hostname de la machine.
Donc sur les deux serveurs Web, créez un fichier index.php dans le dossier /var/www/ et copiez ceci dedans:
<?php echo "Un coucou de ".gethostname()."\n" ?>
]
Supprimez aussi le fichier index.html présent dans ce dossier.
rm /var/www/index.html
Maintenant accédez à http://192.168.2.100 et vous verrez ceci:
Rafraîchissez la page vous de devez voir ceci:
Cela veut dire que la répartition de charge entre les deux serveurs fonctionne :)
Ce qui est intéressant avec HaProxy, si apache est stoppé sur l’un des deux serveurs, HaProxy va arrêter d’utiliser ce serveur.
Si par exemple vous arrêtez Apache sur web2, vous verrez sur la page de stats que web2 est marqué comme DOWN, si vous rafraîchissez la page http://192.168.2.100 seul Un coucou de web1 s’affichera, HaProxy a décidé de lui même de ne plus utiliser Web2.
Voila ce qui met fin à ce tuto sur HaProxy, nous allons voir dans un prochain tuto comment mettre en place un second serveur de répartition de charge passif au cas ou le serveur principal deviendrais défaillant.
(8 commentaires)
Passer au formulaire de commentaire
Bonjour Denis,
J’essaie de récupérer des paramètres passés en argument dans l’url avec la commande %[urlp(user)] pour ajouter une variable dans le header :
http-request set-header X-Alfresco-Remote-User user_id
La commande ‘urlp’ ne semble pas fonctionner. Je ne récupère aucun paramètre.
Pouvez vous m’aider ?
Merci
Seb
Merci pour ce tuto très instructif
Bonjour,
Juste pour info depuis la version 1.6 de haproxy il faut déclarer comme ceci le cluster :
listen cluster_web
bind 192.168.2.100:80
à la place de
listen cluster_web 192.168.2.100:80
Merci pour ce tuto très instructif :)
Merci pour ce petit tuto rapide !
Bonjour,
Je vous avez déjà contacté concernant un autre article sur les clusters. J’ai fini par installer un cluster actif/actif sur 2 serveurs et j’ai utilisé mon serveur bi-xeon pour y installer un datacenter Vmware.
Sur le cluster, Apache fonctionne sans problème en actif/actif ainsi que mes 3 VG (de 2TO,3TO,3 TO). Maintenant je souhaiterai mettre en place un cluster Mysql en actif/actif (1 serveur HAproxy en VM) pour mes 2 serveurs en cluster actif/actif.
Pourriez-vous me conseiller ?
Merci d’avance pour votre réponse (et si cela est possible pour vous, de me répondre par mail, je vous le laisse: adm@bktech.fr)
Cordialement,
Bernard
Bonjour, je souhaiterai faire un cluster pour cacti, et intégrer du load balancing. Pensez-vous que HaProxy soit adapté?
Bonjour Denis,
J’aimerai savoir quel outil tu utilise pour faire la topologie sur le tutoriel HaProxy ? c’est de l’open source ? Merci de me repondre à l’adresse: boubacarly1983@gmail.com
Merci pour ce tuto très interessant.
Cordialement.
Boubacar LY