Équilibrage de charge avec HAProxy sur Ubuntu

guide d'installation HAProxy load balancing Configure on Ubuntu Debian

1. Introduction

Dans le paysage numérique d’aujourd’hui, assurer une haute disponibilité et des performances optimales des applications web est crucial. À mesure que le trafic vers votre site web ou votre application augmente, un seul serveur peut ne pas suffire pour gérer efficacement la charge. C’est là qu’intervient l’équilibrage de charge, et HAProxy se distingue comme l’une des solutions d’équilibrage de charge les plus puissantes et flexibles disponibles.

Ce tutoriel complet vous guidera à travers le processus de configuration et de configuration de HAProxy sur Ubuntu pour distribuer le trafic entrant sur plusieurs serveurs backend. À la fin de ce guide, vous disposerez d’une solution d’équilibrage de charge robuste qui peut améliorer significativement les performances, la fiabilité et l’évolutivité de votre application.

2. Comprendre l’équilibrage de charge

Avant de plonger dans les détails techniques, explorons brièvement ce qu’est l’équilibrage de charge et pourquoi il est essentiel.

L’équilibrage de charge est le processus de distribution du trafic réseau entrant sur plusieurs serveurs. Cette approche offre plusieurs avantages :

  1. Amélioration des performances : En répartissant la charge sur plusieurs serveurs, vous pouvez réduire la charge sur chaque serveur, ce qui conduit à des temps de réponse plus rapides.
  2. Haute disponibilité : Si un serveur tombe en panne, l’équilibreur de charge peut rediriger le trafic vers les serveurs sains restants, assurant que votre application reste disponible.
  3. Évolutivité : À mesure que votre trafic augmente, vous pouvez facilement ajouter plus de serveurs à votre pool backend pour gérer la charge accrue.
  4. Flexibilité : Les équilibreurs de charge vous permettent d’effectuer la maintenance sur les serveurs backend sans temps d’arrêt en les retirant temporairement du pool.

3. Qu’est-ce que HAProxy ?

HAProxy (High Availability Proxy) est une solution gratuite et open-source d’équilibrage de charge et de proxying pour les applications basées sur TCP et HTTP. Il est connu pour sa rapidité et son efficacité, capable de gérer des millions de connexions par seconde.

Les principales caractéristiques de HAProxy incluent :

  • Équilibrage de charge de couche 4 (TCP) et de couche 7 (HTTP)
  • Terminaison SSL/TLS
  • Vérification de l’état des serveurs backend
  • Journalisation et statistiques avancées
  • Routage basé sur le contenu
  • Limitation de débit et protection contre les DDoS

Maintenant que nous comprenons les bases, passons à la mise en œuvre pratique.

4. Mise en place de l’environnement

Pour ce tutoriel, nous supposons que vous travaillez avec Ubuntu 20.04 LTS. Vous aurez besoin de :

  • Un serveur Ubuntu 20.04 avec accès root ou sudo
  • Au moins deux serveurs web backend (nous utiliserons Apache dans ce tutoriel)
  • Connaissance de base de la ligne de commande Linux

Assurez-vous que votre système est à jour avant de continuer :

$ sudo apt update
$ sudo apt upgrade

5. Installation de HAProxy

L’installation de HAProxy sur Ubuntu est simple. Exécutez la commande suivante :

$ sudo apt install haproxy

Une fois l’installation terminée, vous pouvez vérifier la version installée :

$ haproxy -v

Vous devriez voir une sortie similaire à :

HAProxy version 2.4.24-0ubuntu0.22.04.1 2023/10/31

6. Configuration de HAProxy

Le fichier de configuration principal de HAProxy se trouve à /etc/haproxy/haproxy.cfg. Avant d’apporter des modifications, il est recommandé de sauvegarder la configuration originale :

$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

Maintenant, créons une configuration de base. Ouvrez le fichier avec votre éditeur de texte préféré :

$ sudo nano /etc/haproxy/haproxy.cfg

Remplacez le contenu par la configuration de base suivante :

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
frontend http_front
    bind *:80
    stats uri /haproxy?stats
    default_backend http_back
backend http_back
    balance roundrobin
    server web1 10.0.0.1:80 check
    server web2 10.0.0.2:80 check

Cette configuration met en place un équilibreur de charge HTTP de base. Nous expliquerons chaque section en détail plus tard.

7. Configuration des serveurs backend

Pour ce tutoriel, nous supposerons que vous avez deux serveurs web exécutant Apache. Si vous ne les avez pas encore configurés, vous pouvez le faire avec ces commandes sur chaque serveur :

$ sudo apt install apache2
$ sudo systemctl start apache2
$ sudo systemctl enable apache2

Pour différencier les serveurs, vous pouvez personnaliser la page Apache par défaut. Sur chaque serveur, modifiez le fichier /var/www/html/index.html :

$ sudo nano /var/www/html/index.html

Remplacez le contenu par un identifiant simple, comme :

<h1>Bienvenue sur le serveur Web 1</h1>

(Ajustez le numéro pour chaque serveur)

Assurez-vous de noter les adresses IP de vos serveurs backend et mettez à jour le fichier haproxy.cfg en conséquence dans la section backend http_back.

8. Explication du fichier de configuration HAProxy

Décomposons le fichier de configuration HAProxy que nous avons créé précédemment :

Section Global

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

Cette section définit les paramètres globaux :

  • log : Spécifie où envoyer les logs
  • chroot : Change le répertoire racine pour améliorer la sécurité
  • stats socket : Crée un socket UNIX pour les commandes d’exécution
  • user et group : Définit l’utilisateur et le groupe sous lesquels HAProxy s’exécute
  • daemon : Exécute HAProxy en arrière-plan

Section Defaults

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

Cette section définit les paramètres par défaut pour toutes les autres sections :

  • mode http : Définit le mode par défaut sur l’équilibrage de charge HTTP (couche 7)
  • option httplog : Active la journalisation HTTP
  • option dontlognull : Désactive la journalisation des connexions nulles
  • timeout : Définit diverses valeurs de délai d’attente

Section Frontend

frontend http_front
    bind *:80
    stats uri /haproxy?stats
    default_backend http_back

Cette section définit comment les requêtes doivent être traitées :

  • bind *:80 : Écoute sur toutes les interfaces sur le port 80
  • stats uri : Active la page de statistiques à l’URI spécifié
  • default_backend : Spécifie le backend par défaut à utiliser

Section Backend

backend http_back
    balance roundrobin
    server web1 10.0.0.1:80 check
    server web2 10.0.0.2:80 check

Cette section définit les serveurs backend :

  • balance roundrobin : Utilise l’algorithme d’équilibrage de charge round-robin
  • server : Définit chaque serveur backend avec son IP et son port
  • check : Active les vérifications de santé sur les serveurs

9. Test de l’équilibreur de charge

Après avoir configuré HAProxy, redémarrez le service :

$ sudo systemctl restart haproxy

Vous pouvez vérifier le statut pour vous assurer qu’il fonctionne sans erreurs :

$ sudo systemctl status haproxy

Maintenant, vous pouvez tester votre équilibreur de charge en y accédant via un navigateur web ou en utilisant curl :

$ curl http://votre_ip_haproxy

Répétez cette commande plusieurs fois. Vous devriez voir des réponses alternant entre vos serveurs backend, démontrant que l’équilibreur de charge fonctionne.

10. Surveillance et statistiques

HAProxy fournit une page de statistiques intégrée qui offre des informations précieuses sur votre configuration d’équilibrage de charge. Nous l’avons déjà activée dans notre configuration avec la ligne :

stats uri /haproxy?stats

Pour accéder à la page de statistiques, ouvrez un navigateur web et naviguez vers :

http://votre_ip_haproxy/haproxy?stats

Cette page fournit des informations en temps réel sur vos serveurs frontend et backend, y compris :

  • Statut du serveur (UP/DOWN)
  • Sessions actuelles
  • Octets entrants/sortants
  • Taux de requêtes
  • Temps de réponse

Vous pouvez utiliser ces informations pour surveiller la santé et les performances de votre configuration d’équilibrage de charge.

11. Fonctionnalités avancées de HAProxy

HAProxy offre de nombreuses fonctionnalités avancées pour affiner votre configuration d’équilibrage de charge. En voici quelques-unes que vous pourriez trouver utiles :

Terminaison SSL

Pour gérer le trafic HTTPS, vous pouvez configurer HAProxy pour effectuer la terminaison SSL. Cela décharge le traitement SSL de vos serveurs backend. Voici un exemple de configuration :

frontend https_front
    bind *:443 ssl crt /etc/ssl/certs/moncert.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend http_back

Sessions persistantes

Si votre application nécessite une persistance de session, vous pouvez activer les sessions persistantes :

backend http_back
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server web1 10.0.0.1:80 check cookie server1
    server web2 10.0.0.2:80 check cookie server2

Vérifications de santé

HAProxy peut effectuer des vérifications de santé plus avancées. Par exemple, pour vérifier si une URL spécifique renvoie un statut 200 :

backend http_back
    balance roundrobin
    option httpchk GET /health.php
    http-check expect status 200
    server web1 10.0.0.1:80 check
    server web2 10.0.0.2:80 check

Limitation de débit

Pour protéger vos serveurs contre les abus, vous pouvez mettre en place une limitation de débit :

frontend http_front
    bind *:80
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
    default_backend http_back

Cette configuration limite chaque IP à 100 requêtes par 10 secondes.

12. Résolution des problèmes courants

Lorsque vous travaillez avec HAProxy, vous pouvez rencontrer certains problèmes courants. Voici comment les résoudre :

  1. Erreurs de configuration : Vérifiez toujours votre configuration pour les erreurs de syntaxe avant de redémarrer HAProxy :
$ haproxy -c -f /etc/haproxy/haproxy.cfg
  1. Serveurs backend hors service : Vérifiez la page de statistiques HAProxy pour voir si des serveurs backend sont marqués comme DOWN. Vérifiez que vos serveurs backend sont en cours d’exécution et accessibles.
  2. Problèmes de connectivité : Assurez-vous que HAProxy peut atteindre vos serveurs backend. Vérifiez les règles de pare-feu et les configurations réseau.
  3. Problèmes de certificat SSL : Si vous utilisez la terminaison SSL, assurez-vous que vos certificats sont valides et correctement configurés.
  4. Journalisation : Activez la journalisation détaillée pour résoudre les problèmes :
global
    log /dev/log local0 debug

Puis vérifiez les logs :

$ sudo tail -f /var/log/haproxy.log

13. Meilleures pratiques et considérations de sécurité

Pour assurer des performances optimales et la sécurité de votre configuration HAProxy, considérez les meilleures pratiques suivantes :

  1. Mises à jour régulières : Gardez HAProxy et vos serveurs backend à jour avec les derniers correctifs de sécurité.
  2. Communication sécurisée : Utilisez SSL/TLS pour toutes les communications, y compris entre HAProxy et les serveurs backend.
  3. Contrôle d’accès : Mettez en place une liste blanche IP ou une authentification pour les zones sensibles comme la page de statistiques.
  4. Surveillance : Mettez en place une surveillance et des alertes pour HAProxy et vos serveurs backend.
  5. Sauvegarde de la configuration : Sauvegardez régulièrement votre fichier de configuration HAProxy.
  6. Limitation de débit : Mettez en place une limitation de débit pour vous protéger contre les attaques DDoS.
  7. Journalisation : Configurez une journalisation complète pour le dépannage et l’analyse de sécurité.
  8. Utilisateur séparé : Exécutez HAProxy sous un utilisateur séparé, non-root, pour une meilleure sécurité.
  9. TCP Keepalives : Activez les TCP keepalives pour détecter et supprimer les connexions mortes :
option tcpka
  1. Tests réguliers : Testez périodiquement votre configuration d’équilibrage de charge, y compris les scénarios de basculement.

14. Conclusion

Dans ce tutoriel complet, nous avons couvert les éléments essentiels de la mise en place et de la configuration de HAProxy comme équilibreur de charge sur Ubuntu. Nous avons exploré les configurations de base et avancées, les techniques de dépannage et les meilleures pratiques pour maintenir une solution d’équilibrage de charge robuste et sécurisée.

La flexibilité et les puissantes fonctionnalités de HAProxy en font un excellent choix pour améliorer les performances, la fiabilité et l’évolutivité de vos applications web. À mesure que vous vous familiariserez avec HAProxy, vous découvrirez encore plus de façons d’optimiser votre infrastructure pour répondre à vos besoins spécifiques.

N’oubliez pas que l’équilibrage de charge n’est qu’une partie de la construction d’une application web évolutive et résiliente. Envisagez de combiner HAProxy avec d’autres outils et pratiques, tels que la conteneurisation, les déploiements automatisés et une surveillance complète, pour créer une infrastructure web vraiment robuste et efficace.

Laisser un commentaire