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​

Le certificat SSL est porté par Haproxy et se gère avec le script /usr/local/bin/haple.sh : certificats Let’s Encrypt, certificats payants, renouvellement et suppression. Voir la page Certificat SSL.

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