TP HAproxy
I. Objectif
L'objectif de ce TP est d'apprendre à configurer un Load Balancer HAProxy pour répartir la charge sur deux serveurs web. Vous allez d'abord configurer HAProxy pour balancer la charge de manière classique, puis, dans un second temps, vous ajusterez la configuration pour répartir la charge à 1/3 sur un serveur et 2/3 sur l'autre.
Vous mettrez également en place une page de statistiques pour monitorer l'état des serveurs via HAProxy.
II. Contexte
A. Présentation
Votre entreprise dispose de deux serveurs web pour héberger un site en production. Afin d'améliorer la disponibilité et les performances, vous avez décidé de mettre en place un Load Balancer avec HAProxy. Le rôle du Load Balancer est de distribuer les requêtes vers les deux serveurs pour éviter la surcharge d'un seul serveur.
Les adresses IP des serveurs web sont les suivantes :
- Serveur Web 1 : 192.168.1.40
- Serveur Web 2 : 192.168.1.41
Vous devez donc configurer HAProxy pour :
- Répartir les requêtes entre les deux serveurs de manière équilibrée.
- Mettre en place une page de statistiques pour monitorer vos serveurs.
- Ajuster la répartition de la charge pour que :
-
- Le Serveur Web 1 reçoive 1/3 des requêtes.
- Le Serveur Web 2 reçoive 2/3 des requêtes.
B. Matériel utilisé
Pour faire ce TP nous utiliserons des machines virtuelles :
- Pour héberger le serveur HAproxy nous utiliserons un Debian
- Pour héberger les deux serveurs web nous utiliserons deux Debian
- Pour se connecter aux serveurs web et au HAproxy nous utiliserons un Windows 11
III. Schéma réseau
IV. Installation de HAproxy
Commençons par mettre à jour le système
su -
apt update && apt upgrade -y
Vous pourrez ensuite installer HAproxy à l'aide de cette commande
apt install haproxy -y
Une fois l'installation terminée, démarrez HAProxy et activez-le pour qu'il se lance automatiquement au démarrage :
systemctl start haproxy
systemctl enable haproxy
Pour vous assurer que HAProxy fonctionne correctement, vous pouvez vérifier le statut du service avec la commande :
systemctl status haproxy
Si tout est correctement installé, vous verrez un message indiquant que le service est actif et en cours d'exécution.
Documentation officielle
Si vous souhaitez consulter la documentation officielle de HAProxy pour des informations supplémentaires ou des configurations avancées, vous pouvez la trouver ici :
V. Mise en place de la page de statistiques
Nous allons configurer une page de statistiques via le HAproxy, pour surveiller nos serveurs et le trafic réseau.
- La page de statistique sera uniquement disponible en local
- Et nous devrons définir un mot de passe pour accéder à la page de statistiques
A. Page de statistique
Editer le fichier de configuration de HAproxy : Le fichier de configuration HAProxy se trouve généralement à cette adresse : /etc/haproxy/haproxy.cfg
nano /etc/haproxy/haproxy.cfg
Ajoutez la section pour la page de statistiques : joutez la configuration suivante dans le fichier, généralement après la section frontend et backend, ou dans la section listen si vous en avez déjà une.
listen stats
bind 127.0.0.1:8080 # La page de statistiques sera accessible sur localhost:8080
stats enable # Active la page de statistiques
stats uri /haproxy?stats # Définir l'URI pour accéder aux statistiques
stats refresh 10s # Rafraîchir les statistiques toutes les 10 secondes
stats realm HAProxy\ Statistics # Texte affiché dans la fenêtre d'authentification
stats auth admin:password # Nom d'utilisateur et mot de passe pour accéder à la page (modifier ces valeurs)
stats admin if TRUE # Permet d’accéder aux fonctions administratives (redémarrage des serveurs, etc.)
Redémarrer le HAproxy
systemctl restart haproxy
Si votre machine Debian n'a pas d'interface web vous pouvez tester la page de statistiques à partir de la ligne de commande grâce à cette commande :
apt install curl
curl -u admin:password http://localhost:8080/haproxy?stats
Cela vous permettra de voir l'état des serveurs et des statistiques réseau.
Vous pouvez ensuite modifier votre fichier de configuration pour avoir accès à la page de statistiques sur toutes les cartes réseaux en modifiant la ligne deux.
listen stats
bind *:8080 # La page de statistiques sera accessible sur localhost:8080
stats enable # Active la page de statistiques
stats uri /haproxy?stats # Définir l'URI pour accéder aux statistiques
stats refresh 10s # Rafraîchir les statistiques toutes les 10 secondes
stats realm HAProxy\ Statistics # Texte affiché dans la fenêtre d'authentification
stats auth admin:password # Nom d'utilisateur et mot de passe pour accéder à la page (modifier ces valeurs)
stats admin if TRUE # Permet d’accéder aux fonctions administratives (redémarrage des serveurs, etc.)
http://[adresse_ip_de_votre_serveur_HAProxy]:8080/haproxy?stats
Cette page s'affiche :
B. Ajout des deux serveurs web
Nous allons maintenant ajouter nos deux serveurs web sur la page de statistiques, pour ce faire ajouter ces lignes à votre fichier de configuration en n'oubliant pas de changer les ip et mettre celle de vos machines (ligne 36 et 37)
global
log /dev/log local0
log /dev/log 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
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDH>
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
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
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
# Section backend - Répartition de charge entre les deux serveurs
backend http_back
balance roundrobin # Utilisation de la méthode round-robin pour la répartition
option httpchk # Vérification que les serveurs sont actifs
# Serveur Web 1 avec un poids de 1 (1/2 des requêtes)
server web1 192.168.1.40:80 check weight 1
# Serveur Web 1 avec un poids de 1 (1/2 des requêtes)
server web2 192.168.1.41:80 check weight 1
# Configuration de la page de statistiques HAProxy
listen stats
bind *:8080 # Accessible uniquement depuis localhost
mode http
log global
# URL d'accès à la page de statistiques
stats enable
stats uri /haproxy?stats
# Protection par mot de passe
stats auth utilisateur:motdepasse
# Options supplémentaires pour la page de statistiques
stats hide-version # Ne pas afficher la version d'HAProxy
stats refresh 10s # Rafraîchissement automatique toutes les 10 secondes
Redémarrer le HAproxy
systemctl restart haproxy
Retourner sur votre page web et vous pouvez voir que vos serveurs ont été ajouter avec succès
VI. Test de la configuration
A. Répartition de la charge
Les serveurs web devrait se répartir la charge à part égale c'est à dire :
- Serveur web 1 reçoit 1/2 des requêtes
- Serveur web 2 reçoit 1/2 des requêtes
Nous envoyons ensuite des requêtes à nos serveurs web (pour être précis quatre) grâce à la commande "curl"
curl http://127.0.0.1/
Nous pouvons voir les valeurs 0 dans la colonne "Sessions" > "Total"
Dans les mêmes colonnes vu précédemment, nous pouvons voir que la répartition de charge s'effectue bien deux pour le serveur web 2 et deux pour le serveur web 1.
B. Ajustement de la répartition de la charge
Modifier la configuration pour que les serveurs web se répartissent la charge :
- Serveur web 1 reçoit 1/3 des requêtes
- Serveur web 2 reçoit 2/3 des requêtes
Voici la nouvelle configuration :
global
log /dev/log local0
log /dev/log 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
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA256
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
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
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
# Section backend - Répartition de charge entre les deux serveurs
backend http_back
balance roundrobin # Utilisation de la méthode round-robin pour la répartition
option httpchk # Vérification que les serveurs sont actifs
# Serveur Web 1 avec un poids de 1 (1/3 des requêtes)
server web1 192.168.1.40:80 check weight 1
# Serveur Web 2 avec un poids de 2 (2/3 des requêtes)
server web2 192.168.1.41:80 check weight 2
# Configuration de la page de statistiques HAProxy
listen stats
bind *:8080 # Accessible uniquement depuis localhost
mode http
log global
# URL d'accès à la page de statistiques
stats enable
stats uri /haproxy?stats
# Protection par mot de passe
stats auth utilisateur:motdepasse
# Options supplémentaires pour la page de statistiques
stats hide-version # Ne pas afficher la version d'HAProxy
stats refresh 10s # Rafraîchissement automatique toutes les 10 secondes
Nous pouvons voir les valeurs 0 dans la colonne "Sessions" > "Total"
Nous envoyons ensuite des requêtes à nos serveurs web (pour être précis quatre) grâce à la commande "curl"
curl http://127.0.0.1/
Dans les mêmes colonnes vu précédemment, nous pouvons voir que la répartition de charge s'effectue bien trois pour le serveur web 2 et une seule pour le serveur web 1.