HAProxy est un logiciel open source réputé qui fournit un équilibreur de charge haute disponibilité et un proxy inverse pour les applications TCP et HTTP qui répartissent les requêtes sur plusieurs serveurs.
Nous allons ici mettre en place une balance de charge simple entre deux serveurs WEB.
Nous avons besoin d'une VM pfSense pour isoler notre LAN virtuel (192.168.1.0/24) :
Et sur ce LAN nous aurons deux serveurs web :
un serveur HAProxy :
un serveur de base de données (mariaDB) :
et un poste client graphique :
Connecté en root, fixer l’adresse IP statique : 192.168.1.11/24 (passerelle 192.168.1.1) :
nano /etc/network/interfaces
Vérifier / modifier le hostname : srvweb1
dans ces deux fichiers :
nano /etc/hostname
nano /etc/hosts
Installer les outils de base, configurer le sudoer et redémarrer :
apt update
apt upgrade
apt install openssh-server sudo wget
adduser pascal sudo
reboot
Connexion depuis la machine GUI
ssh pascal@192.168.1.11
Installation et configuration du serveur nginx :
sudo apt install nginx
Puis php-fpm :
sudo apt install php-fpm
Modifions la configuration par défaut de nginx :
sudo nano /etc/nginx/sites-available/default
Le contenu doit être :
server {
listen 80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Vérifier que la version de php-fpm indiquée ligne 11 est bien la bonne (8.2 ici), avec la commande
php -v
lancée depuis le shell.
On vérifie que la config nginx est ok :
sudo nginx -t
et rédemarrons le service :
sudo systemctl restart nginx
Puis on crée une landing page html :
sudo nano /var/www/html/index.htm
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bienvenue chez Pascal !</title>
<style>
body {
font-family: 'Arial', sans-serif;
background-color: #f7f7f7;
text-align: center;
margin: 150px;
}
#logo {
width: 200px;
margin-bottom: 50px;
}
p {
color: #555;
font-size: 18px;
}
</style>
</head>
<body>
<img src=" https://melot.fr/div/logo_color_272x92.png" id="logo">
<p>Bonjour ! Merci de visiter mon serveur #1. J'espère que votre journée est merveilleuse.</p>
</body>
</html>
Il reste à vérifier que le site fonctionne correctement depuis le navigateur web, sur
http://192.168.1.11
.
Reprendre les mêmes opérations que pour le serveur 1, avec l’ip 192.168.1.12
, le hostname srvweb2
et l’indication serveur #2
dans le fichier index.html (ligne 28).
Connecté en root, fixer l’adresse IP statique : 192.168.1.10/24
(passerelle 192.168.1.1
) :
nano /etc/network/interfaces
Vérifier / modifier le hostname haproxy
dans ces deux fichiers :
nano /etc/hostname
nano /etc/hosts
On installe les outils de base, configure le sudoer et on redémarre :
apt update
apt upgrade
apt install openssh-server sudo
adduser pascal sudo
reboot
Connexion depuis la machine GUI :
ssh pascal@192.168.1.10
Installation et configuration du service haproxy
sudo apt install haproxy
Puis on modifie le fichier de configuration de haproxy :
sudo nano /etc/haproxy/haproxy.cfg
Ajouter à la fin du fichier :
# On définit la partie frontend
frontend frontend-base
# On définit l'IP et le port sur lequel va écouter le proxy
bind 192.168.1.10:80
# On indique le nom de la partie backend dispo plus bas
default_backend backend-base
# On active le fait de ne pas forwarder les requêtes avec l'IP du
# proxy mais avec l'IP du ou des clients
option forwardfor
# On définit la partie backend
backend backend-base
# On utilise la méthode roundrobin pour le loadbalancing
balance roundrobin
# On définit les serveurs qui sont en backend
server srvweb1 192.168.1.11:80 check
server srvweb2 192.168.1.12:80 check
On redémarre le service :
sudo systemctl restart haproxy
Vérifier la balance de charge avec un navigateur web sur http://192.168.1.10 (actualiser/recharger la page avec F5)
Transmettre votre IP WAN au professeur pour un contrôle d’étape.
Fixer l’adresse IP statique : 192.168.1.20/24 (passerelle 192.168.1.1)
nano /etc/network/interfaces
Vérifier / modifier le hostname mariadb
nano /etc/hostname
nano /etc/hosts
Installation des outils de base et redémarrage :
apt update
apt upgrade
apt install openssh-server sudo
adduser pascal sudo
reboot
Connexion depuis la machine GUI
ssh pascal@192.168.1.20
Installation du service mariadb :
sudo apt install mariadb-server
On procède à l'habituelle configuration de base :
sudo mysql_secure_installation
Dans notre contexte, les réponses à donner sont dans l'ordre : Entrée, n, n, y, y, y, y.
On édite le fichier de configuration de mariadb :
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Commenter la ligne bind-address
pour autoriser des connexions en dehors de la machine hôte :
#bind-address = 127.0.0.1
Relancer le service
sudo systemctl restart mariadb
sudo mysql -u root
On arrive sur le shell mysql où nous allons créer la base de données pascaldb
ainsi que l'utilisateur pascal
(avec son mot de passe P@55word
) qui aura (quasiment) tous les droits sur la base de données, depuis n'importe quelle emplacement :
CREATE DATABASE pascaldb;
GRANT ALL ON pascaldb.* TO 'pascal'@'%' IDENTIFIED BY 'P@55word';
FLUSH PRIVILEGES;
exit;
Installez et personnalisez Wordpress sur le serveur 1, en vous appuyant sur le TP LAMP vu précédemment.
En bref :
cd /var/www/html
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xvzf latest.tar.gz
sudo chown -R www-data:www-data wordpress
sudo apt -y install php-mysql
La base de données n’est pas sur le serveur lui-même (locahost) mais bien sur le serveur qu’on vient tout juste de configurer sur
192.168.1.20
, avec la base de donnéespascaldb
.
Finaliser l’installation de wordpress sur http://192.168.1.11/wordpress
Attention à ne pas adresser le haproxy, mais bien srvweb1 !
Par un moyen à votre convenance, répliquez le serveur web 1 sur le serveur 2 (fichiers de configuration nginx et contenu du répertoire root)
Une méthode :
scp
lancée depuis srvweb1 :sudo scp -r /var/www/html/wordpress root@192.168.1.12:/var/www/html/
Sur srvweb2, ne pas oublier d’installer aussi l’extension mysql pour PHP :
sudo apt -y install php-mysql
Il faut enfin modifier la configuration nginx sur chacun des deux serveurs web :
sudo nano /etc/nginx/sites-available/default
pour que l'emplacement root par défaut soit désormais /var/www/html/wordpress
(ligne 3) :
server {
listen 80 default_server;
root /var/www/html/wordpress;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
On redémarre le service :
sudo systemctl restart nginx
Procédons au contrôle du fonctionnement :
à vous de résoudre les problèmes ! (en attendant la suite du TP
Première piste, modifier le backend HAProxy pour activer les "sticky sessions" :
sudo nano /etc/haproxy/haproxy.cfg
Modifier la fin du fichier :
backend backend-base
balance roundrobin
cookie serveurpm insert indirect nocache
server srvweb1 192.168.1.11:80 check cookie sw1
server srvweb2 192.168.1.12:80 check cookie sw2
On redémarre le service :
sudo systemctl restart haproxy