Comment configurer HAProxy en tant que répartiteur de charge pour Nginx sur CentOS 8

Pour assurer une disponibilité maximale des applications web, leur scalabilité et leurs performances élevées, il est désormais courant de mettre en œuvre des technologies qui introduisent la redondance, telles que le clustering de serveurs et l’équilibrage de charge. Par exemple, la configuration d’un cluster de serveurs exécutant tous les mêmes applications, puis le déploiement de répartiteurs de charge devant eux pour distribuer le trafic.

HAProxy est un répartiteur de charge TCP/HTTP, un serveur mandataire et un terminateur SSL/TLS open-source, puissant, à haute performance, fiable, sécurisé et largement utilisé pour les sites web à très fort trafic. Il fonctionne de manière fiable sous les systèmes d’exploitation Linux, Solaris, FreeBSD, OpenBSD ainsi que AIX.

Ce guide montre comment configurer un répartiteur de charge haute disponibilité dédié avec HAProxy sur CentOS 8 pour contrôler le trafic dans un cluster de serveurs web NGINX. Il démontre également comment configurer la terminaison SSL/TLS dans HAProxy.

Prérequis :

A total of 4 servers with minimal CentOS 8 installation.

Configuration de l’environnement de test

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

Étape 1 : Configuration du serveur HTTP Nginx sur les machines clientes

1. Connectez-vous à toutes vos machines clientes CentOS 8 et installez le serveur web Nginx à l’aide du gestionnaire de paquets dnf comme indiqué.

# dnf install Nginx

2. Ensuite, démarrez le service Nginx, activez-le pour démarrer automatiquement au démarrage du système et confirmez qu’il est en cours d’exécution en vérifiant son statut, en utilisant les commandes systemctl (faites ceci sur toutes les machines clientes).

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. De plus, si le service firewalld est en cours d’exécution sur toutes les machines clientes (ce que vous pouvez vérifier en exécutant systemctl start firewalld), vous devez ajouter les services HTTP et HTTPS dans la configuration du pare-feu pour permettre aux requêtes du répartiteur de charge de passer à travers le pare-feu vers les serveurs web Nginx. Ensuite, rechargez le service firewalld pour appliquer les nouveaux changements (faites ceci sur toutes les machines clientes).

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. Ensuite, ouvrez un navigateur web sur vos machines locales et testez si l’installation de Nginx fonctionne correctement. Utilisez les adresses IP des clients pour naviguer, une fois que vous voyez la page de test Nginx, cela signifie que le serveur web installé sur la machine cliente fonctionne correctement.

Test Nginx Installation on All CentOS 8 Client Machines

5. Ensuite, nous devons créer des pages de test sur les machines clientes que nous utiliserons plus tard pour tester la configuration de HAProxy.

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

Étape 2 : Installation et configuration du serveur HAProxy sur CentOS 8

6. Installez maintenant le package HAProxy sur le serveur HAProxy en exécutant la commande suivante.

# dnf install haproxy

7. Ensuite, démarrez le service HAProxy, activez-le pour démarrage automatique au démarrage du système et vérifiez son état.

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
Verify HAProxy Status in CentOS 8

8. Maintenant, nous allons configurer le HAProxy en utilisant le fichier de configuration suivant.

# vi /etc/haproxy/haproxy.cfg

Le fichier de configuration est divisé en quatre sections majeures.

  • paramètres globaux – définit les paramètres globaux du processus.
  • par défaut – cette section définit les paramètres par défaut pour toutes les autres sections suivant sa déclaration.
  • frontend – cette section décrit un ensemble de sockets d’écoute acceptant les connexions client.
  • Backend – cette section décrit un ensemble de serveurs auxquels le proxy se connectera pour transférer les connexions entrantes.

Pour comprendre les options sous les paramètres globaux et par défaut, consultez la documentation HAProxy (lien fourni à la fin de l’article). Pour ce guide, nous utiliserons les paramètres par défaut.

Configuration des journaux HAProxy

9. Une fois déployé, HAProxy jouera un rôle significatif dans votre infrastructure informatique, il est donc essentiel de configurer les journaux pour obtenir des informations sur chaque connexion à vos serveurs web backend.

Le paramètre de journalisation (surligné dans la capture d’écran suivante) déclare un serveur Syslog global (tel que rsyslog, le choix par défaut dans CentOS) qui recevra les messages de journalisation. Plus d’un serveur peut être déclaré ici.

La configuration par défaut pointe vers localhost (127.0.0.1) et local2 est le code d’équipement par défaut utilisé pour identifier les messages de journalisation HAProxy sous rsyslog.

HAProxy Default Log Parameter

10. Ensuite, vous devez indiquer au serveur rsyslog comment recevoir et traiter les messages de journalisation HAProxy. Ouvrez le fichier de configuration rsyslog à /etc/rsyslog.conf ou créez un nouveau fichier dans le répertoire /etc/rsyslog.d, par exemple /etc/rsyslog.d/haproxy.conf.

# vi /etc/rsyslog.d/haproxy.conf

Copiez et collez la configuration suivante pour collecter les journaux avec UDP sur le port par défaut 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Ajoutez également ces lignes pour indiquer à rsyslog d’écrire dans deux fichiers journaux distincts en fonction de la gravité, où local2 est le code d’équipement défini dans la configuration HAProxy ci-dessus.

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11. Enregistrez le fichier et fermez-le. Ensuite, redémarrez le service rsyslog pour appliquer les changements récents.

# systemctl restart rsyslog

Configuration des Frontaux et des Arrières de HAProxy

12. Dans cette section, nous allons démontrer comment configurer les proxies frontal et arrière. Revenez au fichier de configuration HAProxy et modifiez les sections frontal par défaut et arrière comme suit. Nous n’entrerons pas dans une explication détaillée de chaque paramètre, vous pouvez toujours vous référer à la documentation officielle.

La configuration suivante définit une section listen utilisée pour servir la page Statistiques de HAProxy. Le paramètre bind attribue un écouteur à une adresse IP donnée (* pour tout dans ce cas) et port (9000).

Le paramètre enable des stats active la page de statistiques qui sera accessible en utilisant l’URI /stats (c’est-à-dire http://adresse_ip_serveur:9000/stats).

Le paramètre auth des stats est utilisé pour ajouter une authentification de base lors de l’accès à la page (remplacez haproxy et Lostp@1ss par un nom d’utilisateur et un mot de passe de votre choix).

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:Lostp@1ss

13. La configuration suivante définit une section frontend appelée TL (vous pouvez donner un nom de votre choix). Le paramètre mode définit le mode dans lequel HAProxy fonctionne.

Le paramètre acl (Liste de contrôle d’accès) est utilisé pour prendre une décision basée sur le contenu extrait de la requête. Dans cet exemple, la requête est considérée comme étant du simple HTTP si elle n’est pas faite via SSL.

Ensuite, le paramètre http-request set-header est utilisé pour ajouter un en-tête HTTP à la requête. Cela aide à informer Nginx que la requête initiale a été faite via HTTP (ou via le port 80).

La directive default_backend ou use_backend définit les serveurs backend, dans ce cas, référencés par TL_web_servers.

Notez que HAProxy renverra une erreur « 503 Service Unavailable » si une requête n’est pas dirigée par une directive use_backend ou default_backend.

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14. Ensuite, nous devons définir une section backend où le paramètre balance définit comment HAProxy sélectionne les serveurs backend pour traiter une requête si aucune méthode de persistance ne remplace cette sélection.

La directive cookie permet la persistance basée sur les cookies, elle demande à HAProxy d’envoyer un cookie nommé SERVERID au client et de l’associer à l’ ID du serveur qui a donné la réponse initiale.

La directive server est utilisée pour définir les serveurs amont dans le format nom_serveur (par exemple websrv1), adresse_IP_serveur:port et options.

Une option clé est vérifier qui indique à HAProxy de continuer à vérifier la disponibilité d’un serveur et de rapporter sur la page des statistiques.

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

Commentez toutes les autres sections frontend et backend comme indiqué dans la capture d’écran qui suit. Enregistrez le fichier et fermez-le.

Configuring HAProxy Front-end and Back-ends

15. Redémarrez maintenant le service HAProxy pour appliquer les nouvelles modifications.

# systemctl restart haproxy

16. Ensuite, assurez-vous que les services HTTP (port 80) et HTTPS (port 433) sont ouverts dans le pare-feu pour accepter les demandes des clients comme suit. Ouvrez également le port 9000 dans le pare-feu pour accéder à la page des statistiques et rechargez les paramètres du pare-feu.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

Étape 3 : Tester la configuration de HAProxy et visualiser les statistiques

17. Il est maintenant temps de tester la configuration de HAProxy. Sur la machine de bureau locale à partir de laquelle vous accédez à tous les serveurs, ajoutez la ligne suivante dans le fichier /etc/hosts pour nous permettre d’utiliser le domaine du site fictif.

10.42.0.247  www.tecmint.lan

18. Ensuite, ouvrez un navigateur et naviguez en utilisant soit l’adresse du serveur, soit le domaine du site.

http://10.42.0.247/
OR
http://www.tecmint.lan/
Check HAProxy Setup

19. Pour accéder à la page des statistiques de HAProxy, utilisez l’adresse suivante.

http://10.42.0.247:9000/stats

Ensuite, utilisez le nom d’utilisateur et le mot de passe que vous avez définis dans le fichier de configuration de HAProxy (reportez-vous au paramètre d’authentification des statistiques).

HAProxy Stats Login Page

Après une connexion réussie, vous arriverez sur la page de statistiques de HAProxy qui vous montre des métriques couvrant la santé de vos serveurs, les taux de requêtes actuelles, les temps de réponse, et bien plus encore.

Pour illustrer comment fonctionne le rapport d’état en ce qui concerne les codes couleur, nous avons mis en place l’un des serveurs en back-end.

HAProxy Statistics Report

Étape 4 : Configuration de HTTPS dans HAProxy en utilisant un certificat SSL auto-signé

20. Dans cette dernière section, nous allons démontrer comment configurer SSL/TLS pour sécuriser toutes les communications entre le serveur HAProxy et le client. HAProxy prend en charge quatre modes de configuration majeurs pour HTTPS, mais pour ce guide, nous utiliserons le déchargement SSL/TLS.

En mode déchargement SSL/TLS, HAProxy déchiffre le trafic côté client et se connecte en trafic clair aux serveurs en back-end.

Nous commencerons par créer le certificat et la clé comme indiqué (répondez aux questions en fonction des détails de votre entreprise lors de la création du certificat, comme indiqué sur la capture d’écran).

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l
Create SSL for HAProxy

21. Ensuite, ouvrez le fichier de configuration de HAProxy (/etc/haproxy/haproxy.cfg) et modifiez la section front-end.

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers
Configure HAProxy Front-end with SSL

Enregistrez le fichier et fermez-le.

22. Puis redémarrez le service HAProxy pour appliquer les nouvelles modifications.

# systemctl restart haproxy.service

23. Ensuite, ouvrez un navigateur web et essayez d’accéder au site une fois de plus. Le navigateur affichera une erreur en raison du certificat auto-signé, cliquez sur Avancé pour continuer.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

C’est tout pour le moment ! Chaque application web a ses propres exigences, vous devez concevoir et configurer l’équilibrage de charge pour répondre à votre infrastructure IT et aux exigences de l’application.

Pour obtenir plus d’informations sur certaines des options de configuration utilisées dans ce guide, et généralement comment utiliser HAProxy, consultez la documentation officielle de la communauté HAProxy ou la documentation de la version entreprise de HAProxy. Vous pouvez poser des questions ou partager vos réflexions via le formulaire de feedback ci-dessous.

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/