Mise en place d’un service de répartition de charge avec HAProxy

🔰 Introduction

Lorsque plusieurs utilisateurs accèdent simultanément à un site web ou une application, les performances peuvent rapidement chuter si tout repose sur un seul serveur. Pour résoudre ce problème et assurer performance, redondance et haute disponibilité, on utilise une technique appelée répartition de charge (load balancing).

L’un des outils les plus fiables et performants pour ça, c’est HAProxy.

Dans cet article, on va voir comment installer HAProxy en tant que reverse proxy HTTPS, et automatiser les certificats SSL avec Let’s Encrypt, sans prise de tête.


🧰 Prérequis

  • Un nom de domaine pointé vers l’IP publique de ton serveur (ex: app.mondomaine.fr)
  • Un serveur Linux (Debian / Ubuntu recommandé)
  • Deux ou plusieurs serveurs backend (webservers)
  • Ports 80 et 443 ouverts
  • Accès sudo ou root

1. 📦 Installation de HAProxy et Certbot

sudo apt update
sudo apt install haproxy certbot -y

2. 🔐 Générer un certificat SSL avec Let’s Encrypt

sudo certbot certonly --standalone -d app.mondomaine.fr

👉 Important : Certbot écoute sur le port 80 pour valider le domaine. Ce port ne doit pas être bloqué.

Le certificat généré se trouve dans :

  • /etc/letsencrypt/live/app.mondomaine.fr/fullchain.pem
  • /etc/letsencrypt/live/app.mondomaine.fr/privkey.pem

On doit les combiner pour que HAProxy puisse les utiliser.

sudo cat /etc/letsencrypt/live/app.mondomaine.fr/fullchain.pem /etc/letsencrypt/live/app.mondomaine.fr/privkey.pem > /etc/ssl/private/haproxy.pem

3. ⚙️ Configuration de HAProxy pour HTTPS

Édite le fichier principal de configuration :

sudo nano /etc/haproxy/haproxy.cfg

Exemple de configuration complète :

global
    log /dev/log local0
    daemon
    maxconn 2048
    tune.ssl.default-dh-param 2048

defaults
    log     global
    mode    http
    option  httplog
    option  http-server-close
    timeout connect 5s
    timeout client  30s
    timeout server  30s
    retries 3

frontend http_redirect
    bind *:80
    mode http
    redirect scheme https if !{ ssl_fc }

frontend https_front
    bind *:443 ssl crt /etc/ssl/private/haproxy.pem
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check

4. ✅ Redémarrer HAProxy

sudo systemctl restart haproxy
sudo systemctl enable haproxy

Vérifie l’accès à ton domaine : 👉 https://app.mondomaine.fr

Tu devrais voir la page servie par l’un de tes serveurs backend.


5. 🔄 Renouvellement automatique du certificat SSL

Let’s Encrypt fournit des certificats valides 90 jours. Pour automatiser :

Crée un script post-renew :

sudo nano /etc/letsencrypt/renewal-hooks/post/haproxy-renew.sh

Ajoute :

#!/bin/bash

DOMAIN="app.mondomaine.fr"
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"
TARGET="/etc/ssl/private/haproxy.pem"

cat "$CERT_DIR/fullchain.pem" "$CERT_DIR/privkey.pem" > "$TARGET"
chmod 600 "$TARGET"
chown root:root "$TARGET"

systemctl reload haproxy

Rends le script exécutable :

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/haproxy-renew.sh

Vérifier avec un test :

sudo certbot renew --dry-run

Tu dois voir :

Hook command "haproxy-renew.sh" run successfully

6. 🔍 (Optionnel) Interface de monitoring HAProxy

Ajoute à la fin de haproxy.cfg :

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:admin

Accède à : 👉 http://IP_SERVEUR:8404/stats


🧪 Tester le fonctionnement

  1. Accède à https://app.mondomaine.fr
  2. Recharge plusieurs fois la page → observe la rotation entre les serveurs
  3. Consulte systemctl status haproxy si besoin

🧠 Résumé

✅ Avec cette configuration, tu bénéficies de :

  • Un reverse proxy HTTPS avec certificat Let’s Encrypt
  • Une répartition de charge entre plusieurs serveurs web
  • Une redirection HTTP → HTTPS automatique
  • Un renouvellement SSL 100 % automatisé
  • Un monitoring web intégré