Académique Documents
Professionnel Documents
Culture Documents
avec HAProxy
Sommaire
HAProxy est un relais TCP/HTTP offrant des facilités d'intégration en environnement hautement
disponible. En effet, il est capable :
d'effectuer un aiguillage statique défini par des cookies ;
d'effectuer une répartition de charge avec création de cookies pour assurer la persistance de
session ;
de fournir une visibilité externe de son état de santé ;
de s'arrêter en douceur sans perte brutale de service ;
de modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
d'interdire des requêtes qui vérifient certaines conditions ;
d'utiliser des serveurs de secours lorsque les serveurs principaux sont hors d'usage.
de maintenir des clients sur le bon serveur d'application en fonction de cookies applicatifs.
fournir des rapports d'état en HTML à des utilisateurs authentifiés, à travers des URI de
l'application interceptées.
Il requiert peu de ressources, et son architecture événementielle mono-processus lui permet
facilement de gérer plusieurs milliers de connexions simultanées sur plusieurs relais sans effondrer le
système.
Nous allons nous intéresser essentiellement à la répartition de charges, en tous cas dans un premier
temps.
Pour mettre en pratique les fonctionnalités de répartition de charge et de tolérance aux pannes
proposées par HAProxy, nous allons travailler sur la DMZ de votre agence. Actuellement, cette dernière
se compose uniquement de votre serveur Web linux nommé 100ZDEB81 (100Z représente le numéro
de votre VLAN de DMZ)
L’objectif de ce support est d’utiliser un serveur HAProxy en amont pour qu’il puisse
distribuer/répartir, de manière intelligente les requêtes web envoyées par les clients web vers deux
serveurs web proposant les mêmes services.
Notre DMZ sera donc composée de deux serveurs web et du serveur HAProxy, tous les trois protégés
par le pare-feu IPFIRE déjà en place.
1
2.1 Cloner notre serveur web existant
De manière à obtenir un deuxième serveur web rapidement et à l’identique de l’existant, nous allons
utiliser la notion de clonage proposée par la virtualisation.
L’assistant de clonage VMware vSphere nous a cloné le serveur web mais il va nous falloir désormais
aller personnaliser certaines choses propres au paramétrage logiciel de manière à éviter la notion de
doublon (du côté OS).
2
2.3 Conception du serveur HAProxy
Nous allons maintenant faire une installation basique de Debian 8 (64 bits)
3 LE SERVICE HAPROXY
3.1 Configuration initiale de HAProxy
Nous allons procéder par étape de manière à complexifier la solution en validant chaque évolution.
Nous allons commencer par créer un nouveau fichier de configuration haproxy.cfg avec un minimum
vital, voire même moins …
Remarque : pour la suite, les impressions d’écran de ce fichier seront prises pour l’agence 9, vous
ajusterez donc les valeurs à votre agence.
Pensez à adapter le fichier en remplaçant les valeurs exemples par les valeurs de votre agence.
3
- Vérifiez que la syntaxe du fichier est correcte par la commande suivante :
haproxy –c –f /etc/haproxy/haproxy.cfg
-c pour seulement « checher » (tester/valider) le fichier
-f pour spécifier le fichier de configuration
Remarque : le message final (voir figure ci-dessus) vous indique que le fichier de configuration est
valide, mais un avertissement signale, comme prédit ci-avant, que ce fichier est un « bâclé » : Aucun
timeout n’est précisé, ce qui peut poser problème. Nous traiterons ce paramétrage à la fin du support.
Quelques explications sur ce fichier de configuration :
L’essentiel est tiré de l’article sur Linux Magazine ou de la documentation en ligne
mode permet de spécifier que l’on va travailler sur des flux http
HAProxy fera une analyse détaillée des requêtes clients avant de les faire suivre aux
« frontaux ». Ce mode permettra ultérieurement de faire du filtrage de niveau 7 (OSI).
Les autres modes possibles sont « tcp » (connexions TCP génériques) ou health (ancien
mode utilisé pour la surveillance par des composants externes).
A noter qu’on peut effectuer de la répartition de charge sur autre chose que le service
http.
4
uri : le choix du serveur est fonction du début de l’URI demandée
url_param : le choix du serveur est fonction de paramètres présents dans l’URL
demandée
hdr : le choix du serveur est fonction d’un champ présent dans l’en-tête HTPP
(Host, User-Agent, …)
L’option httpclose force à fermer la connexion http une fois la requête envoyée au client. On
évite ainsi de conserver la connexion HTTP ouverte (« keep-alive ») et donc de renvoyer
systématiquement cette dernière vers le même serveur tant que la connexion reste ouverte.
Conserver la connexion ouverte pourrait être le comportant recherché, mais, dans le cadre de
notre installation, cela permettra de montrer facilement que l’algorithme « roundrobin »
fonctionne bien et que l’on tombe sur un serveur différent à chaque rafraîchissement de la
page.
L’option httpchck, suivie d’une requête HTTP, permet de vérifier qu’un serveur web est
toujours en vie (vérification activée grâce à l’option check de server).
Si un frontal (serveurs web dans notre cas) venait à ne plus répondre (ou pas comme attendu)
à cette requête, il serait considéré comme hors service, et serait sorti du pool des frontaux ;
aucun utilisateur ne serait redirigé vers lui.
La clause server déclare un serveur frontal, utilisé pour assurer le service. Chaque « server »
est nommé et suivi de son IP/port de connexion (port qui pourrait être différent du port
d’écoute de HAProxy).
L’option check est expliquée ci-dessus.
- En tapant la commande suivante : netstat –tpnl | grep haproxy (Pour plus de détail sur netstat voir
document F), nous devrions avoir un résultat. Cette ligne résultat indique que le service HAProxy
écoute bien sur le port 80.
Conclusion : HAProxy est bien lancé et attend des requêtes sur le port 80 !
5
__________________________________________________________________________________
- Faites la ou les manipulations nécessaires pour pouvoir interroger les trois serveurs de la DMZ depuis
le LAN1 avec leur nom DNS.
Notre « cluster » fonctionne merveilleusement, certes, mais on peut encore faire mieux. Comment
savoir ce qui se passe, et comment sont sollicités dans le temps les différents frontaux ? Comment
connaître les éventuels temps d’indisponibilités ? etc…
Peut-être pensez-vous à nagios, Centreon ES ou shinken si vous connaissez ces outils de supervision,
mais haproxy dispose de sa propre interface de statistiques et de surveillance.
La question est donc :
Comment paramétrer HAProxy pour pouvoir accéder aux statistiques de fonctionnement ?
Comment accéder aux statistiques faites sur le fonctionnement de HAProxy ?
Nous allons maintenant faire évoluer le fichier de configuration de HAProxy pour découvrir d’autres
possibilités de ce service de répartition de charge.
6
- Vérifiez que le service peut redémarrer par la commande /etc/init.d/haproxy restart
Vous pouvez visualiser, dans la partie FRONTEND le nombre de sessions reçues sur HAProxy (dans la
figure ci-dessus le nombre est de 81). Dans la partie BACKEND, on constate que la répartition a été
bien faite (de manière équitable) par HAProxy, 39 de ces 81 sessions ont été envoyées et gérées par le
serveur 1 et 39 sessions par le serveur 2. Les 3 restantes correspondent aux interrogations statistiques
faites sur HAProxy et donc traitées uniquement par lui-même puisqu’il est le destinataire final de ces
requêtes statistiques.
7
stats auth en sécurise l’accès en le protégeant par un nom d’utilisateur et un mot de passe,
séparés par « : »
Il est possible d’avoir un cluster composé de serveurs disparates, et que l’on ne souhaite pas leur faire
porter la même charge. Imaginons par exemple un processeur 2 fois moins puissant, une mémoire
moins importante, etc …
Exemple : Le serveur XXXDEB82 est trois fois plus puissant que le serveur XXXDEB81
La question est donc :
Comment paramétrer HAProxy pour répartir la charge sur les serveurs, en fonction de leur
puissance ?
La réponse est :
On va affecter aux serveurs une pondération différente, reflet de leur puissance : par exemple
50 pour XXXDEB81 et 150 pour XXXDEB82 (la valeur doit être comprise entre 0 et 255).
Nous allons maintenant faire évoluer le fichier de configuration de HAProxy pour prendre en compte
cette nouvelle possibilité.
8
- Rechargez le fichier de configuration /etc/init.d/haproxy restart
Notre site de test est simplissime, et ne nous permet pas de détecter cette problématique qui pourtant
poser quelques soucis au gérant d’un site de commerce en ligne.
Nous allons ajouter une 2ème page html (achat.html), accessible depuis la page d’accueil (index.html),
censée permettre d’effectuer des achats en ligne. (Voir document G pour les exemples de code HTML).
TRAVAIL A FAIRE (11)
- Sur les deux serveurs web, modifiez les pages index.html et créez les pages achat.html avec les
contenus proposés dans le document G.
9
Que pensez-vous de la succession de pages suivantes ?
L’affichage n’a aucune importance, car l’internaute ne verrait pas la différence, car la page dans la
réalité serait bien identique quelque soit le serveur ; le nom du serveur a été indiqué à des fins de
démonstration uniquement.
En revanche, sans être un expert des sites web, vous vous doutez bien que cela posera quelques
problèmes.
D’une part il est probable que le changement de serveur d’une page à l’autre soit
couteux, alors qu’il n’est pas vraiment nécessaire, car ce n’est pas une nouvelle
connexion d’internaute mais une simple navigation d’une page à l’autre.
D’autre part, vous avez sans doute entendu parler de session utilisateur. Lorsque vous
réalisez des achats en lignes, votre connexion sur un serveur est une connexion
« suivie » et le changement de serveur implique obligatoirement l’arrêt de la
connexion sur un serveur et une nouvelle connexion sur un nouveau serveur.
Enfin une authentification sur un serveur aura du mal à être valide pour un autre
serveur HTTP.
En effet, lorsqu’un utilisateur s’authentifiera sur le site, en fait il s’authentifiera sur un des frontaux.
Une session sera créée pour lui permettre d’accéder à tous les services, en tous cas à ceux auxquels il
a droit, d’après le statut que son authentification lui a donné.
Le problème, c’est qu’à sa prochaine requête, notre « load-balancer » fera son travail et redirigera
l’utilisateur sur un des frontaux, mais pas forcément le même que celui sur lequel il s’est authentifié.
10
Si ce n’est pas le même serveur, l’utilisateur se retrouvera alors déconnecté du site. Il pourra certes se
ré-authentifier, mais avec un peu de chance il retombera illico sur un autre serveur, et ainsi de suite.
On pourrait le vérifier facilement tout cela en créant une simple variable de session en PHP, mais ce
n’est pas notre tasse de thé le développement ;-) en tous cas pas notre préoccupation ici.
Maintenant que nous avons compris le problème, nous allons tenter de pallier à ce dernier par une
nouvelle version du fichier de configuration.
Comment faire ? Il faudrait que HAProxy puisse effectuer une répartition de charge sur les différents
frontaux, mais qu’un même utilisateur soit toujours redirigé vers le même frontal, afin de gérer
correctement sa session, et donc le cas échéant sont authentification.
HAProxy peut le faire pour vous ! Il suffit d’utiliser une astuce permettant de mémoriser sur le client
le serveur sur lequel on s’est connecté, et de communiquer cette information à chaque nouvelle
requête. Cela s’appelle un cookie ! (si ce n’est pas notre tasse de thé, en revanche c’est bien notre
cookie ;-) Blague de mon ami David, je n’en porte aucune responsabilité … pour une fois.
11
Une ligne cookie est apparue, ainsi qu’un paramètre cookie dans les lignes server.
Le principe est très simple :
A la première connexion de l’utilisateur sur le site, HAProxy va déterminer, selon l’algorithme
sélectionné dans la configuration (ici roundrobin), vers quel frontal le rediriger.
Quand HAProxy récupère auprès du frontal la copie de la page demandée par l’utilisateur, il la
renvoie en y insèrant un cookie QUELSERVEUR valant W1 ou W2 selon le frontal utilisé.
Ainsi à la prochaine requête de notre utilisateur, son navigateur renverra également ce cookie
avec la requête.
HAProxy, en fonction de la valeur, saura déterminer vers quel frontal renvoyer l’utilisateur.
Ainsi, plus de problème de session !
Oui mais si le frontal avait un problème et venait à planter ? L’utilisateur ne pourrait plus se connecter
à notre site !
… MAIS NON !
Bien sûr que si, car HAProxy saura déterminer que QUELSERVEUR pointe vers un serveur qui n’est plus
actif dans le cluster. Il détruira le cookie en lui réassignant une nouvelle valeur pour rediriger
l’utilisateur vers un nouveau frontal.
Certes la session qui était en cours sera alors perdue : il faudra se ré-authentifier. Mais le service sera
toujours rendu et notre cher$$ client aura toujours accès à son site favori !
Il suffit de rajouter les options proposées par défaut dans le fichier de config comme la figure ci-
dessous vous l’indique :
A noter que les warning n’empêchent pas le démarrage du service « à la main », mais empêchent le
« démon » de démarrer lors du boot de la machine.
TRAVAIL A FAIRE (13)
- Modifiez le fichier haproxy.cfg de manière à obtenir un contenu similaire à celui-ci ci-dessus.
- Vérifiez que la syntaxe du fichier est correcte par la commande suivante :
haproxy –c –f /etc/haproxy/haproxy.cfg
12
Désormais le balancing ne se fait plus puisque le navigateur
utilise le cookie à chaque fois, il faut supprimer l’historique à
chaque fermeture d’IE et le balancing reprendra. Nous testons
ici avec un seul client.
13
7 DOCUMENTATION COMPLEMENTAIRE
14
- Tapez la commande hostname 100ZDEB82 (remarque : La modification de la valeur de l’invite
de commande ne se fera qu’après une reconnexion). Elle évitera un redémarrage de l’OS
- Tapez la commande exit pour vous déconnectez et reconnectez-vous en root (votre invite de
commande devrait être à jour désormais avec le nom du serveur web 2.
- Editez le fichier /etc/network/interfaces et incrémentez de 1 l’adresses IP de la MV de
manière à obtenir une valeur conforme à 10.69.Z.2.
- Pour que la modification IP soit effective sans redémarrage du système, il faut taper les
commandes suivantes :
o Ifdown eth0 // Pour désactiver la carte eth0
o Ifup eth0 // Pour réactiver la carte eth0 (en lisant sa config dans le fichier
interfaces)
15
7.3 Document C : Modification du fichier index.html
16
7.4 Document D : Création de la MV HAProxy
17
7.5 Document E : Installation Debian pour HAProxy
Voici une brève synthèse des différentes étapes de l’installation de Debian, cette installation est
identique à celle que vous avez déjà réalisée plusieurs fois au long de votre cursus.
Votre MV avait accès à Internet, elle a donc téléchargée les derniers paquetages en ligne, il n’est
donc pas nécessaire de lancer les commandes apt-get update et apt-get upgrade.
18
7.6 Document F : La commande netstat
netstat affiche les connexions réseau, les tables de routage, les statistiques des interfaces, les
connexions masquées, les messages netlink, et les membres multicast.
Facile (on le trouve en faisant man netstat)
-n -- numeric
affiche les adresses en format numérique au lieu d’essayer de déterminer le nom symbolique
d’hôte, de port ou d’utilisateur
-p -- programs
affiche le nom et le PID des processus propriétaires de chaque socket décrite.
Il faut être le propriétaire d’un processus ou être l’utilisateur root pour disposer de toutes les
informations
Moins facile (on le trouve si on fait netstat –help ou on connaît bien l’ami google ;-)
-t -- tcp
montre uniquement les connexions TCP
-l -- listen
montre uniquement les sockets en attente (listen sockets)
HAproxy attend les requêtes sur les ports 80 ; il écoute donc bien sur le port 80 ; le socket en question
est donc bien « en attente ».
Résultat de la commande netstat –tpnl sur la machine virtuelle HAproxy :
Si HAProxy fonctionnait correctement, vous devriez avoir le résultat suivant à la commande netstat -
tpnl | grep haproxy, je répète si vous n’aviez pas de problème ;-) :
Conclusion : HAProxy est bien lancé et attend des requêtes sur le port 80 !
19
7.7 Document G : Exemples de code HTML pour les pages de test
Sur XXXDEB81
Sur XXXDEB82
Sur XXXDEB81
Sur XXXDEB82
20