
Le projet suivant consiste à mettre en place deux serveur web Apache2 et un serveur HAProxy.
Sur les deux serveurs nous allons mettre en place deux sites web HTTP (site1.fr et site2.fr).
Sur le serveur HAProxy nous allons mettre en place un load-balancing et une haute disponibilité en cas de panne d’un serveur Web.
Sur le ServeurWeb1 une répartition des charges de 50/50 pour les deux sites et une bascule automatique vers le ServeurWeb2 en cas de panne du premier serveur avec une répartition des charges de 80/20 pour les deux sites.
Configuration :
- ServeurWeb1 : 192.168.1.101/24 avec site1.fr et site2.fr
- ServeurWeb2 : 192.168.1.102/24 avec site1.fr et site2.fr
- Serveur HAProxy : 192.168.1.100/24
C’est quoi Apache2 ?
Apache2 (ou Apache HTTP Server) est un serveur web.
Il permet de servir des sites web aux utilisateurs, c’est-à-dire de répondre aux requêtes HTTP et HTTPS en envoyant des pages HTML, des images, etc.
C’est un des serveurs web les plus utilisés au monde, surtout dans les environnements Linux.
C’est quoi HAProxy ?
HAProxy est un équilibreur de charge (load balancer) et un reverse proxy.
Il permet de répartir le trafic entre plusieurs serveurs pour améliorer les performances et la disponibilité.
Un reverse proxy est un serveur intermédiaire qui reçoit les requêtes des clients et les redirige vers un ou plusieurs serveurs en backend, tout en masquant leur identité et en optimisant la distribution du trafic.
Mise en place des Serveur Web
Nous allons commencer par configurer les serveurs Web, nous allons commencer par faire une MAJ du système et ensuite nous allons installer Apache2.
Ouvrir le terminal de votre VM et saisir :
- sudo apt update & sudo apt upgrade
Cette commande met à jour les paquets
- sudo apt install apche2
Cette commande installe le serveur web Apache2
Pour chaque site nous allons mettre en place un répertoire, saisir la commande suivante :
- sudo mkdir -p /var/www/site1.fr/public_html/ (pour le site1)
- sudo mkdir -p /var/www/site2.fr/public_html (pour le site2)
Nous allons mettre en place un fichier HTML pour nous permettre de savoir sur quel site nous nous trouvons.
Pour site1.fr, saisir :
- echo « <html><body><h1>Bienvenue sur Site 1 sur le premier serveur!</h1></body></html> » | sudo tee /var/www/site1.fr/public_html/index.html
Pour site2.fr :
- echo « <html><body><h1>Bienvenue sur Site 2 du premier serveur!</h1></body></html> » | sudo tee /var/www/site2.fr/public_html/index.html
Ensuite, nous allons mettre en place les Virtual Hosts pour les deux sites (site1.fr et site2.fr) sur chaque serveur, saisir la commande suivante :
- /etc/apache2/sites-available/site1.fr.conf
Par la suite nous allons saisir le texte suivant dans le fichier :
- <VirtualHost *:8080> : Le serveur Apache écoute sur le port 8080. Assurez-vous que ce port est bien ouvert dans votre pare-feu et qu’il est autorisé dans la configuration d’Apache (voir ci-dessous).
- ServerAdmin : L’adresse électronique de l’administrateur du site (elle s’affiche dans les pages d’erreur d’Apache).
- ServerName : Le nom de domaine pour lequel ce VirtualHost est configuré (ici site1.fr).
- DocumentRoot : Le répertoire où les fichiers du site sont stockés. Il doit pointer vers le dossier qui contient les fichiers du site web.
- ErrorLog : Le fichier dans lequel les erreurs Apache seront enregistrées pour ce site.
- CustomLog : Le fichier où les accès au site (logs) seront enregistrés. Le format combined inclut des informations comme l’adresse IP, la date, la méthode HTTP, le code de réponse, etc.
Un virtual host (hôte virtuel) permet à un serveur web d’héberger plusieurs sites ou applications sur une seule adresse IP, en les distinguant par le nom de domaine ou le port.
Nous écoutons site1.fr sur le port 8080 et non le 80 mais vous comprendrez par la suite pourquoi.
Etablir la même configuration pour le site2.fr en établissant les changements adéquats, de plus le port écouter sera le 8081 sur site2.fr.
L’étape suivante consiste à activer les sites :
- sudo a2ensite site1.fr.conf (pour le site1)
- sudo a2ensite site2.fr.conf (pour le site2)
Comme nous utilisons des noms de domaine locaux (comme site1.fr et site2.fr), vous devez vous assurer que ces noms pointent vers l’adresse IP de votre serveur HAProxy(qui n’est pas encore mis en place).
Modifiez-le fichier /etc/hosts sur votre machine locale ou sur les machines clientes pour inclure les lignes suivantes :
- 192.168.1.100 site1.fr
- 192.168.1.100 site2.fr
Vous pouvez vérifier la mise en place des sites en changeant l’IP dans le fichier /etc/hosts par l’IP du serveur web et en modifiant le port du virtual host par 80 et non 8080 ou 8081.
J’ai mis l’adresse IP du serveur HAProxy pour aller plus vite.
Mise en place du Serveur HAProxy
Passons maintenant à la mise en place de HAProxy pour la répartition de charge (load balancing) entre les deux sites du serveurweb1(192.168.1.101) et le backup du serveurweb2 (192.168.1.102) en cas de panne du serveurweb1 avec une répartition de 80/20.
Je vais vous guider à travers les étapes pour installer et configurer HAProxy sur le serveur 192.168.1.100
Premièrement il faut installer HAProxy puis l’activer, pour cela saisissez les commandes suivantes :
- sudo apt install haproxy
- sudo systemctl start haproxy
Nous allons maintenant passer à la configuration de HAProxy dirigez-vous vers le fichier suivant et modifiez-le :
- sudo nano /etc/haproxy/haproxy.cfg
Vous devriez avoir une configuration de base qui commence par « global » et finit par « errorfile 504 /etc/haproxy/errors/504.http »
Nous allons ajouter du contenu à la suite de cette configuration :
Objectif de la configuration :
- Mise en place d’un load balancing avec basculement automatique
- Deux backends (web1 et web2) représentant tes deux serveurs Apache.
- Attribution de web1_backend (serveur 192.168.1.101) en priorité.
- Si le serveur principal (web1) est down, tu rediriges tout vers web2_backend (192.168.1.102).
- Et tu fais une répartition 80/20 sur les deux services (site1.fr et site2.fr) de web2.
Explication détaillée :
- Ce frontend écoute tout le trafic HTTP sur le port 80.
- ACLs (Access Control Lists) qui identifient si l’utilisateur accède à site1.fr ou site2.fr via l’en-tête Host.
- Cette ACL vérifie le nombre de serveur disponibles dans web1_backend.
- nbsrv(web1_backend) lt 1 : s’il n’y a aucun serveur actif (ici web1_backend), alors no_primary devient vrai.
- Si aucun serveur dans web1_backend n’est dispo et que le domaine est site1.fr ou site2.fr → redirige vers web2_backend.
- Si les conditions ci-dessus ne sont pas réunies, tu vas par défaut sur web1_backend (prioritaire).
- Load balancing round-robin (alternance entre les sites du serveur).
- httpchk envoie une requête GET / pour vérifier que le serveur répond bien.
- Deux services sur le serveur 192.168.1.101, l’un sur le port 8080 (site1.fr) et l’autre sur 8081 (site2.fr).
- Les poids sont égaux : 50/50 de répartition.
Pour backend web2_backend c’est la même chose sauf pour la répartition des charges.
- Deux services sur le serveur 192.168.1.102, l’un sur le port 8080 (site1.fr) et l’autre sur 8081 (site2.fr).
- Les poids sont répartis : 80% sur site.fr et 20% sur site2.fr
Sauvegarder le fichier puis redémarrer haproxy avec la commande : sudo systemctl restart haproxy
Nous allons maintenant passer au test.
- Load balancing sur le serveur 192.168.1.101 :
Si je rafraichie la page, voici ce que j’obtiens :
- Répartition des charges 80/20 sur serveur 192.168.1.102 si le serveur 192.168.1.101 tombe en panne :
Pour effectuer le test il faut arrêter le service apache2 sur le serveur pour cela dirigez-vous vers le serveur 192.168.1.101 puis saisir la commande suivante : sudo systemctl stop apche2
Pour vérifier que le service est bien arrêté saisir : sudo systemctl status apache2
Par la suite, ouvrir un navigateur puis saisir l’URL : http://site1.fr
Rafraichir la page 10 fois, vous devriez avoir eu 8 fois site1.fr et 2 fois site2.fr.
Questions :
Que se passe-t-il si HAProxy est indisponible ? :
Si HAProxy est indisponible, cela signifie que tout le trafic sera interrompu car HAProxy joue le rôle de reverse proxy et load balancer pour répartir le trafic entre les serveurs Apache (192.168.1.101 et 192.168.1.102).
Les utilisateurs qui tentent d’accéder à site1.fr ou site2.fr verront une erreur 503 Service Unavailable ou un timeout car HAProxy ne pourra plus rediriger le trafic vers les serveurs Apache.
Pourquoi utilise-t-on des ACL dans la configuration HAProxy ?
Les ACL (Access Control Lists) dans la configuration HAProxy sont utilisées pour appliquer des règles de filtrage ou de routage en fonction des informations contenues dans la requête HTTP. Elles permettent de déterminer quelle action prendre en fonction de critères spécifiques.
Dans le cas de HAProxy, les ACL sont principalement utilisées pour :
- Filtrer et acheminer le trafic vers les backends appropriés en fonction de conditions spécifiques (par exemple, l’URL, l’en-tête, l’IP du client, etc.).
- Améliorer la sécurité en bloquant certains types de requêtes ou en autorisant uniquement des connexions provenant de certaines sources.
- Optimiser la répartition du trafic en acheminant les requêtes selon des critères de performance ou de disponibilité.
Quelle est la différence entre « roundrobin » et « leastconn » dans la répartition de charge ?
- Roundrobin : Répartition égale, simple, mais pas dynamique.
- Leastconn : Envoie vers le serveur le moins occupé, mieux pour gérer des serveurs avec des charges variables.
Cela te permet de mieux répartir les requêtes, surtout si certains serveurs sont plus sollicités que d’autres.
A quoi sert le port 8404 d’HAProxy ? Faites une démonstration.
Le port 8404 d’HAProxy est utilisé pour l’interface de statistiques et de monitoring. Cette interface permet de visualiser en temps réel l’état de ton HAProxy, de surveiller les serveurs backend, et de connaître les statistiques liées aux requêtes, aux connexions et à la répartition de la charge. Cela aide à suivre les performances du serveur et à diagnostiquer les problèmes.
Pour le mettre en place il faut ajouter une section au fichier « /etc/haproxy/haproxy.cfg »
- Port 8404 : Le frontend front_stats écoute sur le port 8404 pour les connexions HTTP.
- Interface de stats : Accessible à l’URL http://<ip_ha_proxy>:8404/stats.
- Rafraîchissement toutes les 10 secondes : L’interface affiche les statistiques mises à jour toutes les 10 secondes.
- Authentification : L’accès à l’interface des statistiques est protégé par un nom d’utilisateur et un mot de passe (admin:admin).
Vérifions que cela fonctionne :
Une authentification vous sera demandé, ici admin/admin
Validez puis vous devrez être rediriger vers la page suivante.
On peut observer les choses suivantes :
- Serveurs Backend : L’état de chaque serveur backend (en ligne, hors ligne, etc.).
- Stats : Le nombre total de connexions, de requêtes traitées, de connexions par backend.
- Alertes : Si un serveur backend est down ou s’il y a des problèmes de santé.
Ici on peut voir que le serveur 192.168.1.101 (web1_backend) est DOWN, de plus le serveur 192.168.1.102 (web2_backend) est UP et on peut voir la répartition des charges du test précédent :
On voit que sur 10 sessions il y a eu 8 pour site1.fr et 2 pour site2.fr.
- e SSH ou Apache.