Recherche de site Web

Équilibrer la charge du trafic réseau avec HAProxy


Installez, configurez et exécutez HAProxy pour distribuer le trafic réseau sur plusieurs serveurs Web ou d'applications.

Vous n'avez pas besoin de travailler dans une grande entreprise pour justifier l'utilisation d'un équilibreur de charge. Vous êtes peut-être un amateur et hébergez vous-même un site Web à partir de quelques ordinateurs Raspberry Pi. Peut-être êtes-vous l'administrateur de serveur d'une petite entreprise ; peut-être que vous travaillez pour une grande entreprise. Quelle que soit votre situation, vous pouvez bénéficier de l'utilisation de l'équilibreur de charge HAProxy pour gérer votre trafic.

HAProxy est connu comme « l'équilibreur de charge logiciel le plus rapide et le plus utilisé au monde ». Il intègre de nombreuses fonctionnalités qui peuvent rendre vos applications plus sécurisées et plus fiables, notamment la limitation de débit intégrée, la détection des anomalies, la mise en file d'attente des connexions, les vérifications de l'état ainsi que les journaux et métriques détaillés. L'apprentissage des compétences et des concepts de base abordés dans ce didacticiel vous aidera à utiliser HAProxy pour créer une infrastructure plus robuste et beaucoup plus puissante.

Pourquoi auriez-vous besoin d’un équilibreur de charge ?

Un équilibreur de charge est un moyen de répartir facilement les connexions sur plusieurs serveurs Web ou d'applications. En fait, HAProxy peut équilibrer tout type de trafic TCP (Transmission Control Protocol), y compris les connexions RDP, FTP, WebSockets ou de base de données. La possibilité de répartir la charge signifie que vous n'avez pas besoin d'acheter un énorme serveur Web avec des millions de Go de RAM simplement parce que votre site Web génère plus de trafic que Google.

Un équilibreur de charge vous offre également de la flexibilité. Peut-être que votre serveur Web existant n'est pas assez robuste pour répondre aux pics de demande pendant les périodes de pointe de l'année et que vous souhaitez en ajouter un autre, mais seulement temporairement. Peut-être souhaitez-vous ajouter une redondance en cas de panne d'un serveur. Avec HAProxy, vous pouvez ajouter plus de serveurs au pool back-end lorsque vous en avez besoin et les supprimer lorsque vous n'en avez pas besoin.

Vous pouvez également acheminer les requêtes vers différents serveurs en fonction du contexte. Par exemple, vous souhaiterez peut-être gérer votre contenu statique avec quelques serveurs de cache, tels que Varnish, mais acheminer tout ce qui nécessite du contenu dynamique, tel qu'un point de terminaison d'API, vers une machine plus puissante.

Dans cet article, je vais vous expliquer la configuration d'une installation HAProxy très basique pour utiliser HTTPS pour écouter sur le port sécurisé 443 et utiliser quelques serveurs Web principaux. Il enverra même tout le trafic arrivant à une URL prédéfinie (comme /api/) vers un autre serveur ou pool de serveurs.

Installer HAProxy

Pour commencer, démarrez un nouveau serveur ou une nouvelle instance CentOS 8 et mettez le système à jour :

sudo yum update -y

Cela dure généralement un certain temps. Prenez-vous un café en attendant.

Cette installation comporte deux parties : la première partie installe la version yum de HAProxy et la deuxième partie compile et installe votre binaire à partir des sources pour écraser le HAProxy précédent avec la dernière version. L'installation avec yum fait le gros du travail en ce qui concerne la génération de scripts de démarrage systemd, etc., alors exécutez yum install, puis écrasez le binaire HAProxy avec la dernière version en le compilant à partir de son code source. :

sudo yum install -y haproxy

Activez le service HAProxy :

sudo systemctl enable haproxy

Pour mettre à niveau vers la dernière version (version 2.2, au moment d'écrire ces lignes), compilez le code source. Beaucoup de gens supposent que compiler et installer un programme à partir de son code source nécessite un haut degré de capacité technique, mais c'est un processus assez simple. Commencez par utiliser yum pour installer quelques packages fournissant les outils nécessaires à la compilation du code :

sudo yum install dnf-plugins-core
sudo yum config-manager --set-enabled PowerTools
# (Multiline command next 3 lines. Copy and paste together:) 

sudo yum install -y git ca-certificates gcc glibc-devel \
  lua-devel pcre-devel openssl-devel systemd-devel \
  make curl zlib-devel 

Utilisez git pour obtenir le dernier code source et accédez au répertoire haproxy :

git clone http://git.haproxy.org/git/ haproxy
cd haproxy

Exécutez les trois commandes suivantes pour créer et installer HAProxy avec la prise en charge intégrée de Prometheus :

# Multiline command next 3 lines copy and paste together: 
make TARGET=linux-glibc USE_LUA=1 USE_OPENSSL=1 USE_PCRE=1 \
PCREDIR= USE_ZLIB=1 USE_SYSTEMD=1 \ 
EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o"

sudo make PREFIX=/usr install # Install to /usr/sbin/haproxy

Testez-le en interrogeant la version :

haproxy -v

Vous devriez obtenir le résultat suivant :

HA-Proxy version 2.2.4-b16390-23 2020/10/09 - https://haproxy.org/

Créer le serveur back-end

HAProxy ne dessert aucun trafic directement : c'est le travail des serveurs backend, qui sont généralement des serveurs Web ou d'applications. Pour cet exercice, j'utilise un outil appelé Ncat, le "couteau suisse" du réseau, pour créer des serveurs extrêmement simples. Installez-le:

sudo yum install nc -y

Si SELinux est activé sur votre système, vous devrez activer le port 8404, le port utilisé pour accéder à la page HAProxy Stats (expliqué ci-dessous) et les ports de vos serveurs backend :

sudo dnf install policycoreutils-python-utils
sudo semanage port -a -t http_port_t  -p tcp 8404
sudo semanage port -a -t http_port_t  -p tcp 10080;
sudo semanage port -a -t http_port_t  -p tcp 10081;
sudo semanage port -a -t http_port_t  -p tcp 10082;

Créez deux serveurs web Ncat et un serveur API :

while true ;
do
nc -l -p 10080 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server ONE"' ;
done &

while true ;
do
nc -l -p 10081 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server TWO"' ;
done &

while true ;
do
nc -l -p 10082 -c 'echo -e "HTTP/1.1 200 OK\nContent-Type: application/json\n\n { \"Message\" :\"Hello, World!\" }"' ;
done &

Ces serveurs simples impriment un message (tel que « Ceci est le serveur ONE ») et s'exécutent jusqu'à ce que le serveur soit arrêté. Dans une configuration réelle, vous utiliseriez de véritables serveurs Web et d’applications.

Modifier le fichier de configuration HAProxy

Le fichier de configuration de HAProxy est /etc/haproxy/haproxy.cfg. C'est ici que vous apportez les modifications pour définir votre équilibreur de charge. Cette configuration de base vous permettra de démarrer avec un serveur fonctionnel :

global
    log         127.0.0.1 local2
    user        haproxy
    group       haproxy

defaults 
    mode                    http
    log                     global
    option                  httplog

frontend main
    bind *:80
        
    default_backend web
    use_backend api if { path_beg -i /api/ }
    
    #-------------------------
    # SSL termination - HAProxy handles the encryption.
    #    To use it, put your PEM file in /etc/haproxy/certs  
    #    then edit and uncomment the bind line (75)
    #-------------------------
    # bind *:443 ssl crt /etc/haproxy/certs/haproxy.pem ssl-min-ver TLSv1.2
    # redirect scheme https if !{ ssl_fc }

#-----------------------------
# Enable stats at http://test.local:8404/stats
#-----------------------------

frontend stats
    bind *:8404
    stats enable
    stats uri /stats
#-----------------------------
# round robin balancing between the various backends
#-----------------------------

backend web
    server web1 127.0.0.1:10080 check
    server web2 127.0.0.1:10081 check

#-----------------------------

# API backend for serving up API content
#-----------------------------
backend api
    server api1 127.0.0.1:10082 check

Redémarrez et rechargez HAProxy

HAProxy n'est probablement pas encore en cours d'exécution, alors lancez la commande sudo systemctl restart haproxy pour le démarrer (ou le redémarrer). La méthode restart convient aux situations de non-production, mais une fois que vous serez opérationnel, vous voudrez prendre l'habitude d'utiliser sudo systemctl reload haproxy pour éviter interruptions de service, même si vous avez une erreur dans votre config.

Par exemple, après avoir apporté des modifications à /etc/haproxy/haproxy.cfg, vous devez recharger le démon avec sudo systemctl reload haproxy pour appliquer les modifications. S'il y a une erreur, il vous le fera savoir mais continuera à fonctionner avec la configuration précédente. Vérifiez votre statut HAProxy avec sudo systemctl status haproxy.

S'il ne signale aucune erreur, vous disposez d'un serveur en cours d'exécution. Testez-le avec curl sur le serveur, en tapant curl http://localhost/ sur la ligne de commande. Si vous voyez « Ceci est le serveur ONE », alors tout a fonctionné ! Exécutez curl plusieurs fois et regardez-le parcourir votre pool backend, puis voyez ce qui se passe lorsque vous tapez curl http://localhost/api/. L'ajout de /api/ à la fin de l'URL enverra tout ce trafic vers le troisième serveur de votre pool. À ce stade, vous devriez disposer d’un équilibreur de charge fonctionnel !

Vérifiez vos statistiques

Vous avez peut-être remarqué que la configuration a défini une interface appelée stats qui écoute sur le port 8404 :

frontend stats
    bind *:8404
    stats uri /stats 
    stats enable

Dans votre navigateur, chargez http://localhost:8404/stats. Lisez le blog de HAProxy « Explorer la page de statistiques HAProxy » pour découvrir ce que vous pouvez faire ici.

Un puissant équilibreur de charge

Bien que je n'ai couvert que quelques-unes des fonctionnalités de HAProxy, vous disposez désormais d'un serveur qui écoute sur les ports 80 et 443, redirigeant le trafic HTTP vers HTTPS, équilibrant le trafic entre plusieurs serveurs backend et envoyant même le trafic correspondant à un modèle d'URL spécifique vers un autre serveur backend. . Vous avez également déverrouillé la très puissante page HAProxy Stats qui vous donne un excellent aperçu de vos systèmes.

Cet exercice peut paraître simple, ne vous y trompez pas : vous venez de construire et de configurer un équilibreur de charge très puissant, capable de gérer une quantité importante de trafic.

Pour votre commodité, j'ai mis toutes les commandes de cet article dans un GitHub Gist.

Articles connexes: