🔰 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
- Accède à
https://app.mondomaine.fr
- Recharge plusieurs fois la page → observe la rotation entre les serveurs
- 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é