Recherche de site Web

Comment configurer HAProxy comme équilibreur de charge pour Nginx sur CentOS 8


Pour garantir une disponibilité, une évolutivité et des performances élevées des applications Web, il est désormais courant de mettre en œuvre des technologies introduisant la redondance, telles que le clustering de serveurs et l'équilibrage de charge. Par exemple, configurer un cluster de serveurs qui exécutent tous la ou les mêmes applications, puis déployer un ou plusieurs équilibreurs de charge devant eux pour répartir le trafic.

HAProxy est un équilibreur de charge, un serveur proxy et un terminateur SSL/TLS open source, puissant, hautes performances, fiable, sécurisé et largement utilisé, haute disponibilité TCP/HTTP, conçu pour sites Web à très fort trafic. Il fonctionne de manière fiable sur Linux, Solaris, FreeBSD, OpenBSD ainsi que sur les systèmes d'exploitation AIX.

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

Conditions préalables:

Un total de 4 serveurs avec une installation minimale de CentOS 8.

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 packages dnf comme indiqué.

dnf install Nginx

2. Ensuite, démarrez le service Nginx. Pour l'instant, activez-le pour qu'il démarre automatiquement au démarrage du système et confirmez qu'il est opérationnel en vérifiant son état à l'aide de la commande systemctl. commandes (faites-le sur toutes les machines clientes).

systemctl start nginx
systemctl enable nginx
systemctl status nginx

3. De plus, si le service firewalld est exécuté sur toutes les machines clientes (ce que vous pouvez vérifier en exécutant systemctl start firewalld), vous devez ajouter le HTTP et le Services HTTPS dans la configuration du pare-feu pour permettre aux requêtes de l'équilibreur de charge de traverser le pare-feu vers les serveurs Web Nginx. Rechargez ensuite le service firewalld pour appliquer les nouvelles modifications (faites-le 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 du client pour naviguer, une fois que vous voyez la page de test Nginx, cela signifie que le serveur Web installé sur la machine client fonctionne correctement.

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émarrer automatiquement au démarrage du système et vérifiez son état.

systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy

8. Nous allons maintenant configurer le HAProxy à l'aide du fichier de configuration suivant.

vi /etc/haproxy/haproxy.cfg

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

  • Paramètres globaux : définit les paramètres à l'échelle du processus.
  • valeurs 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 paramètres globaux et valeurs par défaut, lisez la documentation HAProxy (lien fourni à la fin de l'article). Pour ce guide, nous utiliserons les valeurs par défaut.

Configuration de la journalisation HAProxy

9. HAProxy, une fois déployé, jouera un rôle important dans votre infrastructure informatique, la configuration de la journalisation est donc une exigence de base ; cela vous permet d'obtenir des informations sur chaque connexion à vos serveurs Web backend.

Le paramètre log (mis en surbrillance dans la capture d'écran suivante) déclare un serveur Syslog global (tel que rsyslog par défaut dans CentOS) qui recevra les messages de journal. Plusieurs serveurs peuvent être déclarés ici.

La configuration par défaut pointe vers localhost (127.0.0.1) et local2 est le code d'installation par défaut utilisé pour identifier les messages du journal HAProxy sous rsyslog.

10. Ensuite, vous devez indiquer au serveur rsyslog comment recevoir et traiter les messages du journal HAProxy. Ouvrez le fichier de configuration rsyslog dans /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 le journal avec UDP sur le port par défaut 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Ajoutez également ces lignes pour demander à rsyslog d'écrire dans deux fichiers journaux distincts en fonction de la gravité, où local2 est le code d'installation 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. Redémarrez ensuite le service rsyslog pour appliquer les modifications récentes.

systemctl restart rsyslog

Configuration du front-end et du back-end HAProxy

12. Dans cette section, nous montrerons comment configurer les proxys front-end et back-end. Revenez au fichier de configuration HAProxy et modifiez les sections front-end et backend par défaut 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 écouter utilisée pour afficher la page Statistiques HAProxy. Le paramètre bind attribue à un écouteur une adresse IP donnée (* pour all dans ce cas) et un port (9000 ).

Le paramètre stats enable active la page de statistiques qui sera accessible à l'aide de l'URI /stats (c'est-à-dire http://server_ip:9000/stats). .

Le paramètre stats auth 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 à votre guise). Le paramètre mode définit le mode dans lequel HAProxy fonctionne.

Le paramètre acl (Access Control List) permet de prendre une décision en fonction du contenu extrait de la requête. Dans cet exemple, la requête est considérée comme simple HTTP si elle n'est pas effectuée via SSL.

Ensuite, le paramètre http-request set-header est utilisé pour ajouter un en-tête HTTP à la requête. Cela permet d'informer Nginx que la requête initiale a été effectuée 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 non disponible » si une requête n'est pas acheminée par un use_backend ou un default_backend . directive.

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 dans laquelle le paramètre balance définit comment HAProxy sélectionne les serveurs back-end pour traiter une demande si non La méthode de persistance 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 pour l'associer à l'ID du serveur qui a donné la réponse initiale.

La directive server est utilisée pour définir les serveurs en amont au format sever_name (par exemple websrv1), server_IP:port et options.

Une option clé est check qui indique à HAProxy de continuer à vérifier la disponibilité d'un serveur et de créer un rapport sur la page de 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.

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

systemctl restart haproxy

16. Ensuite, assurez-vous que le HTTP (port 80) et le HTTPS (port 433) les services 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 de 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 afficher les statistiques

17. Il est maintenant temps de tester la configuration HAProxoy. Sur l'ordinateur de bureau local à partir duquel vous accédez à tous les serveurs, ajoutez la ligne suivante dans le fichier /etc/hosts pour nous permettre d'utiliser le domaine du site factice.

10.42.0.247  www.tecmint.lan

18. Ouvrez ensuite 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/

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

http://10.42.0.247:9000/stats

Utilisez ensuite le nom d'utilisateur et le mot de passe que vous avez définis dans le fichier de configuration HAProxy (reportez-vous au paramètre stats auth).

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

Pour démontrer le fonctionnement du rapport d'état concernant le fonctionnement des codes couleur, nous avons installé l'un des serveurs back-end.

Étape 4 : Configuration de HTTPS dans HAProxy à l'aide d'un certificat SSL auto-signé

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

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

Nous allons commencer par créer le certificat et la clé comme indiqué (répondez aux questions en conséquence 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

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

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

Enregistrez le fichier et fermez-le.

22. Redémarrez ensuite le service HAProxy pour appliquer les nouvelles modifications.

systemctl restart haproxy.service

23. Ensuite, ouvrez un navigateur Web et essayez à nouveau d'accéder au site. Le navigateur affichera une erreur en raison du certificat auto-signé, cliquez sur Avancé pour continuer.

C'est tout pour le moment! Chaque application Web a son propre ensemble d'exigences, vous devez concevoir et configurer l'équilibrage de charge en fonction des exigences de votre infrastructure informatique et de vos applications.

Pour obtenir plus d'informations sur certaines des options de configuration utilisées dans ce guide, et généralement sur la manière d'utiliser HAProxy, consultez la documentation officielle de l'édition communautaire HAProxy ou la documentation de la version entreprise HAProxy. Vous pouvez poster vos questions ou réflexions via le formulaire de commentaires ci-dessous.