Services redondés

  • Synchroniser des données et de la configuration entre deux VMs

  • Mettre en place un répartiteur de charge pour augmenter la fiabilité et la réactivité du service HTTP

Diagram

Synchronisation des fichiers

On veut synchroniser à la fois les fichiers contenant le site à servir dans /srv/cours-git et la configuration nginx. La VM A deviendra la VM principale, sur laquelle les fichiers HTML servis et la configuration Nginx seront modifiées par la suite, la VM B sera une VM secondaire, recevant les modifications régulièrement.

  1. Créer un script qui permet de synchroniser par SSH depuis la VM A vers la VM B

    • Ajout de fichier

    • Modification de fichier

    • Suppression de fichier

    • Permissions identiques

    • Inclure les fichiers cachés

  2. Automatiser l’exécution de ce script avec cron, toutes les 5 minutes du lundi au vendredi et de 7h à 19h

  3. Observer la différence dans les snapshots ZFS de la VM B

Pour éditer des fichiers de manière plus aisée dans le terminal, on pourrait installer vim et suivre son tutoriel vimtutor
Solution
/root/nginx-sync.sh
#!/usr/bin/env bash

# Synchronisation du dossier /srv
rsync -asrvP --delete /srv/cours-git/ 192.168.122.22:/srv/cours-git/

# Synchronisation de la configuration Nginx
rsync -asrvP --delete /etc/nginx/ 192.168.122.22:/etc/nginx/

# Rechargement de la configuration Nginx
ssh 192.168.122.22 "systemctl reload nginx"

On pensera à rendre le script exécutable :

# chmod +x /root/nginx-sync.sh

Enfin, on déclenchera le script toutes les 5 minutes à l’aide d’un cron, vous pouvez vous aider de services comme Crontab Guru pour comprendre la syntaxe de la périodicité.

# crontab -e
Données du crontab
*/5 7-19 * * 1-5    /root/nginx-sync.sh

On peut vérifier l’exécution du cron avec :

# journalctl -u crond

Répartiteur de charge

On montera une troisième VM (possibilité de cloner la première VM, en faisant attention à changer le nom de machine) afin d’y installer un répartiteur de charge.

Le répartiteur de charge a pour rôle de se mettre devant nos deux nginx et de transférer les requêtes HTTP soit vers l’un, soit vers l’autre.

Dans HAProxy, vous devrez activer une page de statistiques servir sur le même port que les pages, sous le chemin /stats. On partira pour cela du fichier de configuration par défaut de HAProxy, qu’on adaptera pour nos besoins.

Solution
/etc/haproxy/haproxy.cfg - Configuration de la partie frontale
frontend main
    bind *:80 (1)
    default_backend nginx (2)
    stats enable (3)
    stats uri /stats
    stats refresh 10s
    stats admin if TRUE (4)
1 On écoute sur n’importe quelle adresse IP et sur le port 80 de la VM
2 Les requêtes sont transmises au backend s’appelant nginx
3 Les lignes suivantes configurent l’interface de stats et d’administration
4 Ici on laisse l’admin ouvert pour simplifier le debug, mais on configurera un contrôle d’accès avant la mise en production
/etc/haproxy/haproxy.cfg - Configuration des serveurs en arrière-plan
backend nginx (1)
    balance     roundrobin (2)
    server  cesi-adminsys-a 192.168.122.55:80 check (3)
    server  cesi-adminsys-b 192.168.122.89:80 check
1 On précise ici le nom du backend
2 Les requêtes sont transmises alternativement sur chaque serveur disponible, on pourrait à la place choisir un algorithme se basant sur le nombre de connexions totales en cours
3 Ici cesi-adminsys-a est un nom arbitraire, pas forcément le nom de l’hôte. Avec l’instruction check on demande à HAProxy de vérifier régulièrement l’état des serveurs, sans attendre qu’une requête venant du frontend échoue.