[Tutoriels] Configuration d’un cluster Apache 2 avec HAProxy
Bastien Louche | 03/05/2010 | 14:41 |Cet article a été publié il y a plus de 6 mois. Les informations qu'il contient ne sont peut-être plus à jour.
J’ai décidé d’utiliser les machines virtuelles offertes par OVH pendant la phase de test de son offre Cloud Computing, pour vous faire un tutoriel sur la configuration d’un cluster Apache 2 avec HAProxy pour la partie équilibrage de charges.
Il faut donc 3 serveurs, 1 pour HAProxy, et minimum 2 pour le cluster Apache 2, on utilisera un système vierge sous Debian Lenny.
Voici donc un rapide schéma de la mise en place :
Les adresses IP utilisées sont des IP publiques appartenant au Cloud Computing d’OVH, il faudra donc les modifier pendant vos configurations personnelles.
Dans un premier temps on va configurer les serveurs Apache 2 (web1-cloud et web2-cloud) :
apt-get install apache2
Ensuite on créer le fichier qui sera testé par HAProxy pour vérifier que le serveur Apache 2 est opérationnel :
touch /var/www/haproxytest.txt
On va alors modifier légérement la configuration de :
nano /etc/apache2/sites-available/default
Pour ajouter une nouvelle ligne et remplacer le CustomLog afin d’éviter que les logs d’Apache 2contiennent les checks de HAProxy :
SetEnvIf Request_URI « ^/haproxytest\.txt$ » dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog
On peut maintenant redémarrer Apache 2, les serveurs du cluster sont configurés :
/etc/init.d/apache2 restart
On se connecte sur le serveur qui va s’occuper de HAProxy :
apt-get install haproxy
On supprime la configuration par défaut de HAProxy et on re-créer le fichier pour éditer notre configuration :
rm -f /etc/haproxy/haproxy.cfg
nano /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen blweb 178.32.121.84:80
mode http
stats enable
stats auth user:password
balance roundrobin
cookie SERVID prefix
option httpclose
option forwardfor
option httpchk HEAD /haproxytest.txt HTTP/1.0
server web1-cloud 178.32.114.13:80 cookie A check
server web2-cloud 178.32.121.231:80 cookie B check
On peut maintenant lancer HAProxy :
/etc/init.d/haproxy start
Vous pouvez maintenant vous rendre sur l’adresse IP de votre serveur HAProxy via le navigateur de votre choix pour admirer le résultat !
Une petite astuce consiste à modifier le fichier /var/www/index.html pour mieux visualiser quel serveur a répondu à chaque rafraichissement de la page.
A noter que dans notre configuration nous utilisons le paramètre stats enable qui permet à l’aide des identifiants de stats auth de se connecter via http://IP-HAProxy/haproxy?stats à une interface web présentant les statistiques d’utilisation de HAProxy et des différents serveurs Apache 2.
Yop !
apparemment ton tuto est plus à jour que celui-ci : http://www.howtoforge.com/haproxy_loadbalancer_debian_etch
cependant je rencontre toujours le même problème, à savoir que cela ne marche pas =D
je tente (désespérément) de monter une solution de load balancing sans succès.
Je pense aussi que tu te trompes dans le titre de ton tuto, car un cluster permet juste la réplication d’une machine à l’autre, ici tu ne parles pas de réplication mais de répartition de charge !
enfin, j’aimerai juste savoir si ta procédure décrite est juste celle là ou si t’as + bidouiller que ça, car bon, rien qu’en copiant/collant et changeant les IP ca ne fonctionne pas, aucune réponse de HAproxy :/
Bonjour,
Les tutoriels sont directement fonctionnels en copier coller, je fais toujours une vérification en réalisant le tutoriel de A à Z pour voir d’éventuelle erreur.
J’utilise toujours des Debian Lenny vierge et j’indique les dépôts s’ils sont différents de ceux par défaut.
Normalement il ne devrait pas y avoir de problème, mais après il faudrait analyser au cas par cas pour voir ce qui coince dans la mise en place.
Sinon dans le cadre d’un cluster Apache, pour moi ça ne concerne pas une réplication de données mais bien une répartition de la charge.
Je m’explique, en poussant l’architecture mise en place un peu plus loin, on pourrait imaginer que les données soient sur un serveur distinct et que chaque noeud Apache présent dans le cluster y accède via un montage NFS par exemple. Le cluster Apache serait alors dépourvu de données et l’ajout d’un noeud augmenterait alors simplement la capacité de traitement et accessoirement la répartition de charge. De plus la configuration de base de HAProxy propose du Roundrobin donc les requêtes vont être envoyées alternativement vers chaque noeud du cluster Apache, on a donc bien la aussi le concept de la répartition de charge (basique et non intelligente).
Par contre d’autres types de cluster permettent eux d’augmenter la sécurité ou la disponibilité des données via une réplication de leurs contenus donc vous devez sûrement parler de ce type de cluster.
Merci en tout cas pour votre commentaire, et j’espère que vous arriverez bientôt à vos fins avec la mise en place de votre Load Balancing :p
Je vais retenter aujourd’hui ^^
tu parles de round robin, pour moi c’est pas trop de la répartition de charge à proprement parler, c’est un petit trick sur le DNS en lui affectant un NDD sur 2 machines physiques et qui repartit les connexions sur les bécanes ^^
c’est possible que tu détailles la configuration du serveur qui host HAproxy ? car tu dis rien, mais je suppose qu’il lui faut apache2 au mini ! et comment se fait l’installation des stats sans apache2 donc ^^
je suis intéressé pour avoir la config exacte du serveur HAproxy.
tu parles aussi de ça : « Une petite astuce consiste à modifier le fichier /var/www/index.html pour mieux visualiser quel serveur a répondu à chaque rafraichissement de la page »
c’est quoi la petite astuce ;p
woot !
j’ai trouvé mon erreur grâce à la ligne de debug : /usr/sbin/haproxy -d -f /etc/haproxy/haproxy.cfg
ca disait comme erreur : cannot bind socket
donc le port 80 n’était pas « écoutable » par le proxy, en supprimant apache 2 j’ai résolu le problème 🙁
merci pour ton tuto je vais aller le mettre en pratique avec le lien d’avant que j’ai mis !
petite question vu que je m’apprête à rejoindre Orsay pour une LP sécurité & réseau, vous faites quoi en cours ? 😀
Le Roundrobin est une pratique souvent utilisé dans le cadre des DNS mais en fait ça désigne le fait d’alterner de façon basique la destination des requêtes.
Sinon pour le HAProxy, j’ai tout détaillé, en effet, il faut seulement HAProxy sur la machine et en aucun cas Apache ou tout autre serveur web, le site de statistiques de HAProxy est directement intégré dans l’outil.
L’installation des statistiques est d’ailleurs expliqué à la fin du tutoriel. Pareillement pour la configuration, elle est au complet dans le tutoriel.
Pour la petite astuce, en fait au départ si on laisse les Apache par défaut, en rafraichissant la page on ne pourra pas voir le Roundrobin mais seulement le fameux « It works! » donc j’ai simplement modifier le fichier index.html pour ajouter l’identifiant du serveur et ainsi constater le bon fonctionnement de HAProxy et des différents noeuds du cluster Apache.
Content que le problème soit résolu, c’est mieux quand ça marche 🙂
Pour la Licence Pro, j’étais sur Marseille à Luminy, en Administration et Sécurité des Réseaux, donc une grosse partie réseau avec du Cisco, après un bonne partie aussi administration et sécurité sur Linux Debian, une partie administration Windows et enfin une partie sécurité avec cryptage, sécurité physique, normes, piratages etc…
Le site de l’IUT : http://www.iut-gtr.univ-mrs.fr/
Bonne continuation 😉
Bonjour,
J’ai une petite question voila mes serveur backend apache2 sont sur un reseau local avec haproxy en frontend, les serveur de backend sont connecter a un serveur NFS ou sont stocker les differents site et je voudrai y mettre aussi les fichier log (access et error) des apache.
En fait mon but c’est qu’un autre serveur avec awstats puisse utilise ses log mais voila le probleme qui se pose c’est qu’il se passe presque une minute complete avant que les log s’enregistre sur le serveur NFS
Si vous avez une idée je suis prenneur
—-
Guillaume
Bonjour,
Il peut y avoir une limitation au niveau réseau ou des accès disques lors du transfert vers le serveur de fichiers, mais je ne sais pas vraiment comment expliquer ce phénomène surtout sur un réseau local ou les limitations matérielles sont moindres.
En tout cas c’est une architecture web bien sympa 😉
Hi, sorry but my English is much better than my written French. I would like to do something similar but I would like to use two haproxy server with heartbeat to avoid a single point of failure. Do you know how to do that? I am pretty confused with the RIPE failover IPS…
Hello,
Yes it’s possible to install two or more HAproxy servers to avoid a SPOF, but you need to share an IP address between the two HAproxy servers to allow connection on the primary HAproxy server and if this server is down, to migrate the IP address on the second HAproxy server to not disturb your production.
I found this document, I think it will be usefull for your problem.
http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-heartbeat-on-debian-lenny
Regards.
Bonjour,
Merci pour cet exemple très clair, je vois un peu miex comme configurer.
Par contre, je tourne en rond sur une « bêtise » : au niveau du serveur web, l’adresse IP qui envoit la requête est celle du loadbalancer et non l’ip officielle du browser qui interroge.
Comment puis-je l’obtenir ?
Merci,
Christophe
Bonjour,
Je pense qu’un apt-get install libapache2-mod-rpaf peut résoudre ce problème, je l’utilise pour enregistrer les IP des visiteurs même lorsqu’ils traversent mon reverse proxy en front end, sinon il faudrait creuser dans ce sens, un module capable de conserver l’IP source même lors d’un passage transparent à travers un proxy.
En espérant avoir pu vu aider 🙂
Bonjour,
Comment ce passe la gestion des sessions dans le cas de la mise en place de plusieurs serveurs web ?
Quelle est l’option a mettre pour gerer les sessions ?
Merci pour ton aide.
Joe
Bonjour,
Il y a plusieurs solutions, soit la session n’est pas importante et elle sera sur chaque serveur web avec le risque de la perdre si le serveur plante, soit il est possible de la stocker en base de données, soit et c’est je pense la meilleure solution au niveau performance externaliser les sessions sur un service supplémentaire comme Sharedance ou Memcached.
Bastien.
salut bastien. Au fait je viens juste d’installer le noyau de debian sans interface graphique ni de paquets supplementaires. J’aimerai savoir donc les miroirs que vous utilisé pour la configuration de haproxy et des serveurs web.
Je vous invite à suivre ce tutoriel pour le maintien à jour d’une version stable de Debian (à adapter avec la version actuelle de Debian), http://www.bastien-louche.fr/2010/03/comment-avoir-debian-stable-a-jour/
Merci bastien. sinon est-ce-que vous avez fait des tuto sur l’installation et la configuration de jdk, apache-tomcat et le depliement d’application j2e sous debian lenny.
Merci d’avance.
Non désolé, tous mes tutoriels sont accessibles sur ce blog 🙂
Merci j’ai finalement configuré apach avec tomcat. Mais est ce que apache doit etre installé sur le serveur HAPROXY et aussi comment modifier le fichier /var/www/index.html pour avoir le resultat.
Merci d’avance.
j’ai finalement reussi a voir les statistique de haproxy mais mon probème est comment les clients accedent aux serveurs web en passant par le haproxy. c’est a dire via quelle adresse ip(celle du haproxy ou celle d’une des servers web). MERCI
Les clients accèdent uniquement à l’IP du HAProxy, c’est la seule qui doit être publique, les serveurs web peuvent même être sur un réseau local derrière, c’est le HAproxy qui gére la répartition sur les différents noeuds du cluster web.
cela signifie donc le srver haproxy aura deux cartes reseau; mais mon probleme est que je ne sais pas exacement l’URL par lequel les client accedent aux server web. si je tape l@ IP du server haproxy seulement j’obtiens ‘it works’. Merci d’avance.
C’est à dire ?
Vous cherchez à savoir sur quel serveur les clients arrivent ?
oui parce que en tapant l@ ip flotante sur une machine cliente, c’est à dire par exemple x.x.x.x:8080/monalication/ j’ai l’erreur Not Found.
Merci d’avance.
Les clients doivent accéder au site via l’IP du HAProxy normalement via le port 80, mais le site est aussi disponible via l’IP de chaque serveur web via le port 8080.
ce tutoriel est intéressant. je veux savoir dans le cas des machines virtuelles, comment se fait la configuration de la machine du haproxy vu qu’elle doit avoir une entre elle et le client et une autre avec les serveurs web. Concernant la configuration de haproxy, est ce qu’elle devrait etre dans le fichier haproxy.cfg (en le modifiant vu qu’il contient une configuration par défaut) ou bien créer un autre fichier haproxy.conf comme j’ai trouvé dans certains tutoriels?
Je me permet de faire un petit edit a ton billet pour ceux désireux d’installer haproxy sur une debian wheezy.
Celui ci n’est plus dispo dans les depots a cause de bug non corrigé, il est cependant possible de l’installer en rajouter dans votre source.list la ligne suivante:
deb http://ftp.debian.org/debian/ wheezy-backports main
Faite ensuite un apt-get update puis un apt-get install haproxy.
Ensuite il est nécessaire de modifier dans /etc/default/haproxy la ligne ENABLED=0 en ENABLED=1 sinon le script présent dans init.d ne fera rien 🙂
voili voilou
Bonjour,
Merci beaucoup pour ces précisions qui pourront aider d’autres personnes !
Bastien Louche.
Bonjour
J’ai tout configuré mais :
1- oû je doit mettre mes fichiers html ?
2- comment mettre un nom de domaine (exemple.com)
Par défaut, les fichiers sont dans /var/www/.
Pour le reste, il y a quelques explications ici : http://doc.ubuntu-fr.org/tutoriel/virtualhosts_avec_apache2
Il faut chercher comment « configurer un vhost apache » afin de pouvoir réaliser ce que vous voulez faire.
Bonne continuation !
Bonjour,
j’ai suivi votre tutoriel, mais j’ai rencontré un problème que haproxy n’est pas dans /etc/init.d . Où peut -on le trouver??
Merci