Mise en place de Nginx en Failover avec Keepalived

Présentation de Keepalived

Keepalived est un logiciel de routage écrit en C. Il offre des fonctionnalités simples et robustes d'équilibrage de charge et de haute disponibilité aux systèmes Linux.

Dans cet article, je vais vous présenter comment faire du Failover avec Nginx et Keepalived. L'idée est simple, dans notre cas, nous allons monter deux serveurs nginx et le but, c'est que lorsque le serveur Nginx MASTER est down, Keepalived bascule automatiquement sur le SLAVE grâce à une IP virtuel (VIP). 

Sur nos deux serveurs

  • Installons le package keepalived
sudo dnf install keepalived
  • Nous allons mettre en place nginx status et appliquer la configuration
vi /etc/nginx/conf.d/00-nginx-status.conf
server {
   listen 80;
   location = /nginx-status {
       stub_status on;
       allow 127.0.0.1;
       allow ::1;
       deny all;
   }
}
systemctl reload nginx
  • Nous allons créer un script check_nginx.sh qui va nous servir à vérifier si nginx répond 
vi /etc/keepalived/check_nginx.sh
#!/bin/bash
# Check if nginx process is running
if [ -z "$(pidof nginx)" ]; then
   exit 1
fi
# Check if nginx is responding
if [ -z "$(curl -s http://localhost/nginx-status)" ]; then
   exit 1
fi
exit 0
  • Mettons-les droits d'exécution sur le script
chmod +x /etc/keepalived/check_nginx.sh

Sur notre serveur maitre

  • Dans le dossier de configuration keepalived, nous allons faire une sauvegarde du fichier de configuration 
cd /etc/keepalived/
mv keepalived.conf keepalived.conf.origin
  • Maintenant, nous allons éditer cette configuration
vi /etc/keepalived/keepalived.conf
vrrp_script check_nginx {
   script "/etc/keepalived/check_nginx.sh"
   interval 2   # Check every 2 seconds
   weight 2     # Add 2 points if check is successful
   fall 2       # Require 2 failures to mark as failed
   rise 1       # Require 1 success to mark as recovered
}

vrrp_instance VI_1 {
   state MASTER
   interface eth0          # Update with your network interface
   virtual_router_id 51    # Must be the same on all nodes
   priority 101            # Higher value means higher priority
   advert_int 1
   
   authentication {
       auth_type PASS
       auth_pass YourSecurePassword  # Generate a secure password with `openssl rand -hex 32`
   }
   
   virtual_ipaddress {
       192.168.15.112/24   # Your virtual IP address
   }
   
   track_script {
       check_nginx
   }
}
  • Remplacer YourSecurePassword par une pass phrase longue que vous pouvez générer via la commande openssl
openssl rand -hex 32

Sur notre serveur slave

  • Dans le fichier keepalived.conf que nous venons de créer, nous allons replacer les valeurs state et prioriry
state BACKUP
priority 100            # Lower than the MASTER priority

Sur nos deux serveurs

  • Et, enfin, nous allons activer et lancer le service keepalived
systemctl enable --now keepalived.service

Test

  • Sur le serveur maitre via la commande ipvous deviez voir apparaître maintenant la VIP 
[root@front-1 ~]# ip a show eth0
2: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
   link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet 192.168.15.113/24 brd 192.168.15.255 scope global noprefixroute eth0
      valid_lft forever preferred_lft forever
   inet 192.168.15.112/24 scope global secondary eth0
      valid_lft forever preferred_lft forever
  • Et si vous arrêtez le serveur maitre, la VIP devrait basculer sur le serveur slave

Add new comment