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

Laisser un commentaire