Aller au contenu principal

Haproxy

Présentation

Haproxy est en charge de

  • la terminaison SSL ;
  • du HTTP/2 ;
  • de la sécurité des connexions ;
  • du routage évolué.
RôleRépartiteur de charge
SupervisionUne sonde vérifie que le service répond ainsi que les backends
Privilège super-utilisateurreload/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

Limitation

Rechercher

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

Source