HAProxy ou High Availability Proxy est un équilibreur de charge TCP et HTTP open source et un logiciel de serveur proxy. HAProxy a été écrit par Willy Tarreau en C, il prend en charge SSL, les compressions, le keep-alive, les formats de journal personnalisés et la réécriture d'en-tête. HAProxy est un serveur proxy et un équilibreur de charge rapide et léger avec une faible empreinte mémoire et une faible utilisation du processeur. Il est utilisé par de grands sites comme Github, StackOverflow, Reddit, Tumblr, Twitter et autres. Il est devenu l'équilibreur de charge logiciel et le serveur proxy les plus populaires au cours des dernières années.
Dans ce tutoriel, je vais vous guider à travers l'installation et la configuration de HAProxy pour 3 serveurs, un équilibreur de charge et deux serveurs Web Nginx. Nous allons installer HAProxy sur un seul serveur, puis installer le serveur Web Nginx sur les autres serveurs. HAProxy agit comme un équilibreur de charge pour les serveurs Web Nginx.
Concept de base avec HAProxy
Couche 4 et couche 7
HAProxy peut s'exécuter en deux modes :le mode TCP Layer 4 et le mode HTTP Layer 7. En mode TCP Layer 4, HAProxy transmet les paquets TCP RAW du client aux serveurs d'applications. En mode HTTP de couche 7, HAProxy analyse l'en-tête HTTP avant de le transmettre aux serveurs d'applications. Dans ce didacticiel, nous utiliserons Nginx comme serveur Web qui ne prend en charge que le mode HTTP de couche 7.
Algorithme d'équilibrage
Il s'agit de l'algorithme utilisé par HAProxy pour sélectionner le serveur lors de l'équilibrage de charge. Les modes suivants sont disponibles :
Roundrobin
C'est l'algorithme d'équilibrage le plus simple. Pour chaque nouvelle connexion, elle sera gérée par le prochain serveur backend. Si le dernier serveur backend de la liste est atteint, il recommencera à partir du haut de la liste backend.
Dernière connexion
La nouvelle connexion sera gérée par le serveur principal avec le moins de connexions. Ceci est utile lorsque le temps et la charge des requêtes varient beaucoup.
Source
Ceci est pour les sessions persistantes, l'IP du client sera hachée pour déterminer le serveur backend qui a reçu la dernière requête de cette IP. Ainsi une IP A sera toujours gérée par backend1, et une IP B sera toujours gérée par banckend2 pour ne pas interrompre les sessions
Il existe d'autres algorithmes. Consultez le site officiel HAProxy pour plus de détails.
Prérequis
- 3 CentOS 7
équilibreur de charge
192.168.1.102
nginx1
192.168.1.104
nginx2
192.168.1.105
- Privilèges root sur les 3 serveurs.
Étape 1 - Configurer les fichiers /etc/hosts
Connectez-vous au serveur d'équilibrage de charge et modifiez le fichier /etc/hosts.
ssh [email protected]
sudo su
vi /etc/hosts
Ajoutez les noms d'hôte nginx1 et nginx2 :
192.168.1.104 nginx1.loadbalancer.me nginx1
192.168.1.105 nginx2.loadbalancer.me nginx2
Enregistrez le fichier et quittez l'éditeur.
Ensuite, modifiez le fichier hosts sur les serveurs Nginx (nginx1 et nginx2) :
ssh [email protected]
ssh [email protected]
Modifiez et ajoutez une nouvelle ligne pour l'équilibreur de charge dans les fichiers hôtes :
vi /etc/host
Ajoutez le nom d'hôte de l'équilibreur de charge sur chaque serveur nginx :
192.168.1.102 loadbalancer
faites ceci sur les serveurs nginx1 et nginx2.
Étape 2 - Installer et configurer HAProxy
HAProxy est disponible dans le référentiel CentOS 7, connectez-vous au serveur loadbalancer et mettez à jour les listes de packages :
ssh [email protected]
yum -y update
Installez maintenant HAProxy avec cette commande yum :
yum -y install haproxy
Lorsque l'installation est terminée, allez dans le répertoire "/etc/haproxy/" et sauvegardez le fichier de configuration d'origine :
cd /etc/haproxy/
mv haproxy.cfg haproxy.cfg.orig
Ensuite, ajoutez un nouveau fichier de configuration HAProxy "haproxy.cfg" avec l'éditeur vi :
vi haproxy.cfg
Collez la configuration ci-dessous :
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2 #Log configuration
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy #Haproxy running under user and group "haproxy"
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
#HAProxy Monitoring Config
#---------------------------------------------------------------------
listen haproxy3-monitoring *:8080 #Haproxy Monitoring run on port 8080
mode http
option forwardfor
option httpclose
stats enable
stats show-legends
stats refresh 5s
stats uri /stats #URL for HAProxy monitoring
stats realm Haproxy\ Statistics
stats auth howtoforge:howtoforge #User and Password for login to the monitoring dashboard
stats admin if TRUE
default_backend app-main #This is optionally for monitoring backend
#---------------------------------------------------------------------
# FrontEnd Configuration
#---------------------------------------------------------------------
frontend main
bind *:80
option http-server-close
option forwardfor
default_backend app-main
#---------------------------------------------------------------------
# BackEnd roundrobin as balance algorithm
#---------------------------------------------------------------------
backend app-main
balance roundrobin #Balance algorithm
option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost #Check the server application is up and healty - 200 status code
server nginx1 192.168.1.104:80 check #Nginx1
server nginx2 192.168.1.105:80 check #Nginx2
Enregistrez le fichier de configuration et quittez.
Ensuite, configurez rsyslog pour HAProxy.
Nous allons configurer le démon rsyslog pour enregistrer les statistiques HAProxy. Modifiez le fichier rsyslog.conf pour permettre au port UDP 514 d'être utilisé par rsyslog.
vi /etc/rsyslog.conf
Décommentez cette ligne pour activer la connexion UDP :
$ModLoad imudp
$UDPServerRun 514
Si vous souhaitez utiliser une adresse IP spécifique, vous pouvez ajouter une nouvelle ligne comme celle ci-dessous :
$UDPServerAddress 127.0.0.1
Enregistrez le fichier et quittez.
Créez ensuite un nouveau fichier de configuration haproxy pour rsyslog :
cd /etc/rsyslog.d/
vi haproxy.conf
Collez la configuration ci-dessous :
local2.=info /var/log/haproxy-access.log #For Access Log
local2.notice /var/log/haproxy-info.log #For Service Info - Backend, loadbalancer
Enregistrez et quittez.
Redémarrez maintenant rsyslog puis démarrez haproxy :
systemctl restart rsyslog
systemctl start haproxy
Ajoutez haproxy pour démarrer au démarrage :
systemctl enable haproxy
Étape 3 - Installer et configurer Nginx
Dans cette section, nous allons installer Nginx à partir du référentiel epel sur les serveurs nginx1 et nginx2.
Connectez-vous aux serveurs :
ssh [email protected]
ssh [email protected]
Installez le référentiel epel avec la commande yum ci-dessous :
yum -y install epel-release
Vous pouvez maintenant installer Nginx :
yum -y install nginx
Nginx est installé. Allez dans le répertoire web et modifiez le fichier d'index afin que nous puissions voir lequel des deux serveurs a livré le fichier html :
cd /usr/share/nginx/html/
echo "<h1>nginx1.loadbalance.me</h1>" > index.html #For nginx1 server
echo "<h1>nginx2.loadbalance.me</h1>" > index.html #For nginx2 server
Ensuite, ajoutez Nginx pour qu'il démarre au démarrage, puis démarrez-le :
systemctl enable nginx
systemctl start nginx
Assurez-vous d'effectuer cette étape sur les serveurs nginx1 et nginx2.
Étape 4 - Tester
Test depuis le navigateur en accédant à l'IP de l'équilibreur de charge :192.168.1.102
Test avec la commande curl :
curl 192.168.1.102
Test de connexion à la surveillance Web HAProxy qui s'exécute sur le port 8080 avec le nom d'utilisateur et le mot de passe "howtoforge":
http://192.168.1.102:8080/stats
HAProxy fonctionne correctement et agit comme un équilibreur de charge pour nos deux serveurs Web Nginx.
Conclusion
HAProxy ou proxy haute disponibilité est un logiciel open source qui fournit une haute disponibilité pour les services basés sur TCP, il fonctionne comme équilibreur de charge HTTP et serveur proxy. Le logiciel est écrit en C et prend en charge SSL, keep-alive et la compression. HAProxy est le bon choix pour tous ceux qui ont besoin d'un équilibreur de charge et d'un serveur proxy rapides et légers avec une faible empreinte mémoire et une faible utilisation du processeur. Haproxy peut fonctionner en mode TCP de couche 4 et en mode HTTP de couche 7. Nginx ne prend en charge que le mode HTTP Layer 7 avec HAProxy. Si vous souhaitez utiliser le mode TCP de couche 4, vous pouvez utiliser d'autres serveurs Web comme apache. Sur CentOS 7, HAProxy est disponible dans le référentiel par défaut. Il est facile à installer et à configurer.