Haproxy
Présentation
Haproxy est en charge de
- la terminaison SSL ;
- du HTTP/2 ;
- de la sécurité des connexions ;
- du routage évolué.
Rôle | Répartiteur de charge |
---|---|
Supervision | Une sonde vérifie que le service répond ainsi que les backends |
Privilège super-utilisateur | reload/restart via synchroGS |
Le service HAproxy écoute sur le port 80 et 443 en lieu et place du service apache qui lui écoute sur le port 8080, le service de cache varnish peut être configuré sur le port 6081. Cela implique que les vhosts apache doivent écouter sur le port 8080 et que le certificat SSL est porté par le service HAproxy.
Cohabitation Apache et Haproxy
Exemple de vhost apache
<VirtualHost *:8080>
ServerAdmin postmaster@nom_de_domaine.tld
ServerName nom_de_domaine.tld
ServerAlias www.nom_de_domaine.tld
CustomLog /home/zzxxxx/logs/apache/nom_de_domaine.tld_access.log combined
ErrorLog /home/zzxxxx/logs/apache/nom_de_domaine.tld_error.log
LogLevel warn
DocumentRoot /home/zzxxxx/htdocs/nom_de_domaine.tld
# This is an exemple to use PHP 8.1 version
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/8.1-zzxxxx.sock|fcgi://localhost"
</FilesMatch>
<Directory "/home/zzxxxx/htdocs/nom_de_domaine.tld">
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
<Directory "/home/zzxxxx/htdocs/nom_de_domaine.tld/.well-known">
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
ServerSignature Off
</VirtualHost>
Certificat SSL
Certificat payant
Les certificats SSL doivent être déposés dans le dossier /home/admin{custcode}/ssl/hap/
sous la forme d’un fichier conteneur certificat.pem
. Attention le fichier {certificat}.pem
doit être la concaténation du certificat de votre domaine, du certificat intermédiaire et de la clef privée.
Gratuit avec Let’s encrypt
Avant execution du script ci-dessous, il est impératif de vérifier que le domaine pointe bien sur l’adresse ip serveur ou bien celle du loadbalancer.
Règles
Création avec haple.sh
!!! Attention !!! par robustesse, choisissez de multiplier les certificats plutôt que d’ajouter pleins de domaines à un seul et unique certificat, car en cas d’anomalie de renouvellement sur un des domaines, le certificat entier ne serait pas renouvelé.
Exemple de création d’un certificat avec le script /usr/local/bin/haple.sh
par l’utilisateur admin :
sudo /usr/local/bin/haple.sh create email@mondomaine.com www.mondomaine.org
Renouvellement
Vous n’aurez jamais besoin de lancer le renouvellement mais voici la commande
sudo /usr/local/bin/haple.sh renew
Par cron
Vous devez ajouter cette commande dans votre crontab pour que le renouvellement se fasse automatiquement.
Exemple
0 2 * * 1,5 sudo /usr/local/bin/haple.sh renew > /dev/null
Dans l’exemple ci-dessus, à deux heures du matin, chaque semaine, les lundi et vendredi, une tâche de renouvellement sera lancée.
Suppression
sudo certbot --config-dir=ssl/ delete --cert-name toto.com
puis synchronisation avec le slave
sudo synchroGS -r haproxy
X-Forwarded-For
HAProxy gère la terminaison SSL/TLS et donc les certificats , ce qui signifie qu’il décrypte les requêtes HTTPS avant de les transmettre aux serveurs backend via HTTP. Dans un tel scénario, le serveur backend n’a pas connaissance de l’originalité des requêtes HTTPS car il les reçoit uniquement en HTTP. Cela peut poser problème pour des applications web comme WordPress qui ont besoin de savoir si la requête initiale était sécurisée (HTTPS) pour générer correctement des URLs, rediriger le trafic, ou ajuster les comportements liés à la sécurité.
if (!empty($_SERVER[’HTTP_X_FORWARDED_PROTO’]) && $_SERVER[’HTTP_X_FORWARDED_PROTO’] === ’https’) {
$_SERVER[’HTTPS’] = ’on’;
}
En insérant ce petit bloc de code dans le fichier wp-config.php, vous permettez à WordPress ou d’autres CMS (Joomla, Drupal, Prestashop, Typo3 par exemple) de vérifier cet en-tête et de définir la variable $_SERVER[’HTTPS’] à ’on’ lorsque la requête originale était en HTTPS.
Tips Wordpress : à mettre avant les 2 dernières lignes du fichier wp-config.php