HAProxy est un équilibreur de charge open source, capable d’équilibrer n’importe quel service basé sur TCP. Il est couramment utilisé pour équilibrer HTTP et peut aider à résoudre les problèmes de trafic sur votre serveur Web. Voici comment le configurer.
Qu’est-ce que HAProxy ?
Les équilibreurs de charge comme HAProxy vous permettent de répartir le trafic sur plusieurs serveurs, ce qui le rend plus facile à gérer. Au lieu de pointer votre adresse IP vers votre serveur Web, vous la pointez vers un serveur HAProxy, qui déciderait où l’envoyer à partir de là. HAProxy est très léger et ne nécessite pas beaucoup de ressources pour fonctionner, vous pouvez donc utiliser un seul équilibreur de charge pour de nombreux serveurs principaux. Idéalement, vous souhaitez que votre serveur HAProxy et vos serveurs Web soient hébergés dans le même centre de données, à partir du même fournisseur de cloud, afin de réduire la latence.
HAProxy permet également à votre réseau d’être plus résilient. Si un serveur Web tombe en panne, HAProxy peut acheminer le trafic vers le reste pendant que vous diagnostiquez le problème. Pour qu’il soit vraiment résilient, vous aurez besoin d’un serveur HAProxy de secours, au cas où votre équilibreur de charge tomberait en panne.
Même avec HAProxy, vous aurez toujours besoin d’un CDN de site complet devant lui, à la fois pour gérer une charge supplémentaire et pour avoir plusieurs points de présence plus proches de l’utilisateur final.
Comment configurer l’équilibrage de charge HAProxy
Tout d’abord, installez HAProxy à partir du gestionnaire de packages de votre distribution. Pour les systèmes basés sur Debian comme Ubuntu, ce serait :
apt-get install haproxy
Ensuite, vous devrez l’activer en modifiant le script d’initialisation à /etc/default/haproxy
et réglage ENABLED
à 1 :
ENABLED=1
Maintenant, si tu cours service haproxy
, vous devriez voir qu’il est activé et prêt à être configuré. Commençons par archiver le fichier de configuration par défaut :
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.old
Créez un nouveau fichier de configuration à sa place et commencez par ajouter quelques paramètres globaux :
global log 127.0.0.1 local0 notice maxconn 2000 user haproxy group haproxy stats enable stats uri /haproxy?stats stats realm HAProxy Statistics stats auth admin:password
Les log
Le paramètre spécifie le serveur syslog auquel HAProxy envoie les journaux. Vous aurez besoin d’avoir un serveur comme rsyslog en cours d’exécution pour l’utiliser. Les maxconn
le paramètre spécifie le nombre maximal de connexions simultanées, et user
et group
spécifiez sous quel utilisateur Unix HAProxy fonctionne.
Les dernières lignes activent la page de statistiques intégrée de HAProxy, que vous pouvez afficher en accédant à l’URI dans votre navigateur. Dans ce cas, ce serait http://your_ip/haproxy?stats
, mais vous pouvez en voir une démo ici.
Ensuite, nous allons définir la configuration par défaut qui s’appliquera à tous listen
bloque s’il n’y apporte aucune modification :
defaults log global mode http option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 10000 timeout server 10000
Nous définissons la valeur par défaut pour utiliser le paramètre de journal global, opérer sur HTTP et définir certains paramètres liés aux délais d’expiration de la connexion.
Nous allons créer un frontend
bloc qui fera le gros du travail, et acheminer les connexions vers le backend :
frontend proxy bind *:80 # ACL function declarations acl is_abuse src_http_req_rate(Abuse) ge 10 acl inc_abuse_cnt src_inc_gpc0(Abuse) gt 0 acl abuse_cnt src_get_gpc0(Abuse) gt 0 # Rules tcp-request connection track-sc0 src table Abuse tcp-request connection reject if abuse_cnt http-request deny if abuse_cnt http-request deny if is_abuse inc_abuse_cnt option httpclose option forwardfor use_backend appname
La première ligne lie cette interface au port 80, où HAProxy écoutera.
Les deux sections suivantes concernent la limitation du débit. Tout d’abord, les fonctions de liste de contrôle d’accès (ACL) sont déclarées, qui déterminent si une adresse IP est abusive. Ensuite, un ensemble de règles rejettera une connexion si elle fait trop de demandes.
Les forwardfor
L’option transmettra l’adresse IP du client au serveur. Étant donné que HAProxy agit comme un proxy inverse, votre serveur nginx ne verra que l’adresse IP de votre serveur HAProxy. Cette option définit le X-Forwarded-For
En-tête HTTP à l’adresse IP du client.
Et enfin, nous définissons ceci frontend
block pour utiliser le backend « appname », que nous devrons créer. Les backend
block définit simplement les serveurs vers lesquels transférer, ainsi que quelques options :
backend appname your_ip:80 balance roundrobin cookie SERVERNAME insert server web1 web1_ip:80 check cookie web1 server web2 web2_ip:80 check cookie web2
Les balance
La directive définit comment HAProxy équilibre les demandes entre les serveurs. L’option la plus courante est roundrobin
, qui alternera les connexions via chaque serveur dans l’ordre. Si vous rencontrez des problèmes d’équilibre, vous pouvez essayer d’utiliser l’option leastconn
, qui sélectionne en fonction des connexions simultanées. Si vous avez besoin que les utilisateurs accèdent au même serveur via plusieurs connexions, vous pouvez utiliser le source
option, qui sélectionne en fonction d’un hachage de l’adresse IP du client.
Les deux dernières lignes allouent des serveurs à ce listen
bloquer. Vous leur donnez un nom (web1
et web2
) spécifiez leurs adresses, puis répertoriez quelques options. Ici, on utilise le check
paramètre pour s’assurer que le serveur est sain et accepte les connexions, et le cookie
paramètre pour définir le SERVERNAME
cookie (que nous avons inséré directement ci-dessus) au nom du serveur, qui est utilisé pour la permanence de la session (afin que l’utilisateur ne change pas de serveur lorsqu’il utilise votre site). Les balance source
option atteint ce même effet.
Et parce que nous utilisons la limitation du débit, nous aurons en fait besoin d’un autre backend pour stocker les adresses IP :
backend Abuse stick-table type ip size 100K expire 30m store gpc0,http_req_rate(10s)
Cela ne transfère en fait aucune connexion ; il fonctionne comme une table dans laquelle stocker les adresses. Les adresses sont vidées après 30 minutes, de sorte que les adresses jugées abusives seront bloquées pendant 30 minutes.
Enfin, vous pouvez démarrer le service HAProxy en exécutant :
service haproxy start