← évolutif
420-5A4-MT · Module 2 · Semaine 8 · Laboratoire

Balancement de la charge TCP :
HAProxy et deux serveurs Varnish

Une seule adresse d'entrée, deux caches derrière : HAProxy reçoit tout le trafic et le distribue en Round-Robin aux serveurs Varnish, avec un traitement particulier pour l'administration de WordPress.

Topologie du laboratoire : HAProxy devant deux serveurs Varnish devant Apache
La topologie de la semaine : HAProxy → deux Varnish → Apache.

1 · Installation de HAProxy

$ sudo apt-get update $ sudo apt-get -y install haproxy

Vérifier l'installation :

$ haproxy -v
HA-Proxy version 1.6.3 2015/12/25 Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>
Contexte Client Cornucopia

Cornucopia · Application Pratique sur le Terrain

Ce laboratoire technique s'inscrit directement dans l'infrastructure de la ferme maraîchère de Flora et Hazel pour garantir la réactivité et la stabilité de leurs services bio en ligne.
Cas d'Usage Concret

Appliquer les configurations optimisées pour soutenir les pics de consultation des abonnés de la ferme.

2 · Configuration de HAProxy

Éditer le fichier de configuration :

$ sudo nano /etc/haproxy/haproxy.cfg

Le fichier de configuration se lit dans cet ordre, et il faut le respecter (mélanger frontend et backend produit une erreur) :

La configuration complète (la partie en rouge est l'ajout au fichier livré par défaut) :

global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon ca-base /etc/ssl/certs crt-base /etc/ssl/private ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend site_http mode http bind 192.168.56.40:80 option forwardfor default_backend site_http_varnish frontend site_https mode tcp bind 192.168.56.40:443 option forwardfor default_backend ssh_https_apache backend site_http_varnish mode http balance roundrobin server site1 192.168.56.30:80 check inter 10s server site2 192.168.56.31:80 check inter 10s option httpchk backend ssh_https_apache mode tcp balance source server ssh1 192.168.56.10:443 check inter 10s
192.168.56.40 est l'adresse de VOTRE serveur HAProxy; 192.168.56.30 et .31 sont vos deux serveurs Varnish; 192.168.56.10 est le serveur Apache. Adapter à vos machines.

Vérifier la configuration

Les erreurs éventuelles sont affichées pour qu'on puisse les réparer :

$ haproxy -f /etc/haproxy/haproxy.cfg -c

Appliquer la nouvelle configuration

$ sudo service haproxy restart

3 · Que fait-on dans le cas de WordPress ?

WordPress est parfait pour mettre en évidence les particularités des applications web modernes : une interface publique (le blogue) et un panneau d'administration sécurisé. Le balancement concerne surtout la partie publique - le panneau d'administration peut exiger qu'UN SEUL serveur le traite en tout temps, pour la cohésion des chemins sauvés en session.

Informer WordPress de son URL d'accès

Mettre l'adresse IP de HAProxy (ou le nom de domaine qui pointe sur HAProxy) dans les réglages :

Réglages WordPress avec l'adresse de HAProxy
WordPress doit générer ses liens avec l'adresse d'entrée.

Traiter certains URL différemment

Éditer /etc/haproxy/haproxy.cfg et ajouter à la partie frontend site_http :

acl has_admin path_beg /wp-admin acl has_login path_beg /wp-login.php use_backend admin_servers if has_admin or has_login

Puis ajouter à la suite du backend site_http_varnish :

backend admin_servers mode http balance source server ssh1 192.168.56.10:80 check inter 10s option httpchk

Et appliquer :

$ sudo service haproxy restart
Résultat : le public est balancé entre les deux Varnish, mais /wp-admin et /wp-login.php filent toujours vers le même serveur (balance source) - l'administration reste cohérente.

Référence d'origine : wordpress.stackexchange.com - How to layer 7 load balance WordPress backend and frontend · Document du cours recréé en HTML pour la semaine 8 · La suite : l'IP virtuelle avec Heartbeat pour que HAProxy lui-même ne soit plus un point de panne.