Surveillance serveur · 7 min read · Oct 09, 2025

Le Cluster Web Parfait Équilibré et Haute Disponibilité Avec 2 Serveurs Fonctionnant Sous Xen Sur Ubuntu 8.04 Hardy Heron - Page 9

15. Scripts personnalisés pour la surveillance (lb1, lb2, web1, web2)

J’ai créé quelques scripts bash pour surveiller l’ensemble de la configuration (ils sont un peu laids mais ils fonctionnent). Si vous les améliorez, n’hésitez pas à me les envoyer par mail !

15.1 Surveillance depuis lb1.example.com

Tout d’abord, nous devons installer sendmail afin que lb1.example.com puisse envoyer des mails :

apt-get install sendmail

Le premier script vérifiera si le répartiteur de charge de secours (lb2.example.com) est toujours disponible pour prendre le relais :

vi /root/lb2_check

#!/bin/bash
# Vérification du répartiteur de charge de secours
# Copyright (c) 2008 blogama.org
# Ce script est sous licence GNU GPL version 2.0 ou supérieure
# ---------------------------------------------------------------------
### Ce script effectue 1 vérification ###
### 1) Vérifie si le répartiteur de charge de secours a échoué et envoie une notification par mail ###
### À modifier ###
EMAIL="[email protected]"
###### Ne pas modifier en dessous ######
### Binaires ###
MAIL=$(which mail)
### Pour restaurer à l'original lorsque le problème est résolu ###
if [ $1 ]; then
  if [ $1=="fix" ]; then
    rm /root/lb2_problem.txt
    > /var/log/ha-log
    exit 1;
  fi
fi
### Vérifier si déjà notifié ###
cd /root
if [ -f lb2_problem.txt ]; then
  exit 1;
fi
### Vérifier si Heartbeat fonctionne en attente chaude ###
tail /var/log/ha-log 2>&1 | grep "Demande à l'autre côté de compter les nœuds ping"
if [ "$?" -ne "1" ]; then
  echo "Le répartiteur de charge de secours a échoué" > /root/lb2_problem.txt
  $MAIL -s "Problème de répartiteur de charge de secours" $EMAIL < /root/lb2_problem.txt
fi

Nous rendons ce script exécutable :

chmod +x /root/lb2_check

Si lb2.example.com échoue, alors il créera un fichier /root/lb2_problem.txt et enverra une notification par mail. Tant que le fichier lb2_problem.txt est présent, il ne vérifiera plus. De plus, nous devons vider le fichier journal une fois le problème résolu pour que le script fonctionne correctement.

Une fois le problème résolu sur lb2.example.com, veuillez exécuter manuellement :

/root/lb2_check fix

Le script suivant vérifiera si des ports ont échoué sur web1 ou web2 en vérifiant le fichier journal de ldirectord. Il y a déjà une notification par mail avec ldirectord mais elle envoie des millions de notifications, la mienne n’en envoie qu’une jusqu’à ce que vous résolviez le problème :

vi /root/ports_failed

et faites-le ressembler à ceci :

#!/bin/bash
# Vérification des échecs de ports Ldirectord
# Copyright (c) 2008 blogama.org
# Ce script est sous licence GNU GPL version 2.0 ou supérieure
# ---------------------------------------------------------------------
### Ce script effectue 1 vérification ###
### 1) Vérifie les échecs de ports sur les serveurs équilibrés ###
### À modifier ###
EMAIL="[email protected]"
###### Ne pas modifier en dessous ######
### Binaires ###
MAIL=$(which mail)

#pour restaurer à l'original lorsque le problème est résolu
if [ $1 ]; then
  if [ $1=="fix" ]; then
    rm /root/port_problem.txt
    > /var/log/ldirectord.log
  fi
fi
### vérifier si déjà notifié ###
cd /root
if [ -f port_problem.txt ]; then
  cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
  exit 1;
fi
### Vérifier si un port a échoué ###
cat /var/log/ldirectord.log 2>&1 | grep Deleted
if [ "$?" -ne "1" ]; then
  cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
  cat "Problème de ports voir le fichier journal /var/log/port_problem.log" > /root/port_problem.txt
  $MAIL -s "Certains ports ont échoué" $EMAIL < /root/port_problem.txt
fi

Nous le rendons exécutable :

chmod +x /root/ports_failed

C’est la même chose que le premier script, une fois le problème résolu, vous devez exécuter :

/root/ports_failed fix

afin de faire fonctionner à nouveau le script.

Maintenant, ajoutez les deux scripts à votre crontab :

crontab -e

* * * * * /root/ports_failed  >/dev/null 2>&1
* * * * * /root/lb2_check  >/dev/null 2>&1

15.2 Surveillance depuis lb2.example.com

La surveillance du deuxième répartiteur de charge est importante car elle nous indiquera si le répartiteur de charge principal a échoué et, si c’est le cas, gardez un œil sur les échecs de ports sur web1 et web2.

Tout d’abord, nous devons installer sendmail afin que lb2.example.com puisse envoyer des mails :

apt-get install sendmail

vi /root/ports_check

Et collez ce script :

#!/bin/bash
# Vérification des échecs de ports Ldirectord
# Copyright (c) 2008 blogama.org
# Ce script est sous licence GNU GPL version 2.0 ou supérieure
# ---------------------------------------------------------------------

### Ce script effectue 2 vérifications ###
### 1) Vérifie si le répartiteur de charge principal a échoué et envoie une notification par mail ###
### 2) Si le répartiteur de charge principal a échoué, vérifie les échecs de ports sur les serveurs équilibrés ###
### À modifier ###
EMAIL="[email protected]"
###### Ne pas modifier en dessous ######
### Binaires ###
MAIL=$(which mail)
### Date ###
NOW=$(date)
### Pour restaurer à l'original lorsque le problème est résolu ###
if [ $1 ]; then
  cd /root/
  if [ $1=="fix" ]; then
  
    if [ -f lb1_problem.txt ]; then
      rm /root/lb1_problem.txt
    fi
  
    if [ -f port_problem.txt ]; then
      rm /root/port_problem.txt
    fi
  
    if [ -f /root/server_problem_notified.txt ]; then
      rm /root/server_problem_notified.txt
    fi
  > /var/log/ldirectord.log
  > /var/log/ha-log
  exit 1;
  fi
fi
# vérifier si ldirectord fonctionne sur lb2.example.com (signifie que lb1.example.com a échoué)
#$LDIRECTORD /etc/ha.d/ldirectord.cf status 2>&1 | grep running
cat /var/log/ha-log | grep "prise de contrôle complète" > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  ### vérifier si déjà notifié ###
  cd /root
  if [ -f port_problem.txt ]; then
    cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
    exit 1;
  fi
  ### Vérifier si un port a échoué ###
  cat /var/log/ldirectord.log 2>&1 | grep Deleted
  if [ "$?" -ne "1" ]; then
    cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
    echo "Problème de ports voir le fichier journal /var/log/port_problem.log" > /root/port_problem.txt
    $MAIL -s "Certains ports ont échoué" $EMAIL < /root/port_problem.txt
  fi
       
  ### Vérifier si déjà notifié que le répartiteur de charge principal a échoué ###
  cd /root
  if [ -f server_problem_notified.txt ]; then
    exit 1;
  fi
        
  ### Notifier que le répartiteur de charge principal a échoué ###
  cd /root
  MESSAGE="$NOW : Le répartiteur de charge principal a échoué"
  echo $MESSAGE > lb1_problem.txt
  $MAIL -s "Le répartiteur de charge principal a échoué" $EMAIL < /root/lb1_problem.txt
  echo "notifié" > server_problem_notified.txt
fi

Nous le rendons exécutable :

chmod +x /root/ports_check

Et nous l’ajoutons à notre crontab :

crontab -e

* * * * * /root/ports_failed  >/dev/null 2>&1

Lorsque vous recevez une notification du script, veuillez exécuter ensuite :

/root/ports_check fix

15.3 Surveillance depuis web1 & web2

La surveillance du cluster web est déjà partiellement effectuée avec monit et munin.

La partie qui n’est pas encore couverte est la surveillance de la réplication MySQL.

Veuillez lire l’article suivant :

Réparer la réplication master-master MySQL

La surveillance de MySQL est optionnelle mais sur un serveur de production, des problèmes peuvent survenir avec la réplication MySQL, donc je recommande vraiment d’utiliser ces scripts ou quelque chose de similaire pour vérifier la cohérence des bases de données.

15.4 Surveillance depuis un serveur distant

Cette partie ajoute une sécurité supplémentaire en vérifiant les ports importants (25,53,80,443) depuis un serveur distant (installer dns-utils pour dig) :

#!/bin/bash
# Script pour vérifier les ports importants sur un serveur web distant
# Copyright (c) 2008 blogama.org
# Ce script est sous licence GNU GPL version 2.0 ou supérieure
# ---------------------------------------------------------------------
### Ce script effectue une vérification sur les ports 25, 53, 80 et 443 ###
### Après 2 vérifications échouées, il enverra une notification par mail ###
### À modifier ###
WEBSERVERIP="192.168.1.106"
MAILSERVERIP="192.168.1.106"
EMAIL="[email protected]"
DNSSERVERIP="192.168.1.106"
DOMAINTOCHECKDNS="example.com"
DOMAINIP="192.168.1.106"

###### Ne pas modifier en dessous ######
### Binaires ###
MAIL=$(which mail)
TELNET=$(which telnet)
DIG=$(which dig)
### Vérifier si déjà notifié###
cd /root
if [ -f server_problem.txt ]; then
  exit 1;
fi
### Tester SMTP ###
(
echo "quit"
) | $TELNET $MAILSERVERIP 25 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PORT CONNECTÉ"
else
  if [ -f server_problem_first_time_25.txt ]; then
    echo "PORT 25 NON CONNECTÉ" >> /root/server_problem.txt
  else
    echo "NON CONNECTÉ" > /root/server_problem_first_time_25.txt
  fi
fi
### Tester HTTP ###
(
echo "quit"
) | $TELNET $WEBSERVERIP 80 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PORT CONNECTÉ"
else
  if [ -f server_problem_first_time_80.txt ]; then
    echo "PORT 80 NON CONNECTÉ" >> /root/server_problem.txt
  else
    echo "NON CONNECTÉ" > /root/server_problem_first_time_80.txt
  fi
fi
### Tester HTTPS###
(
echo "quit"
) | $TELNET $WEBSERVERIP 443 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PORT CONNECTÉ"
else
  if [ -f server_problem_first_time_443.txt ]; then
    echo "PORT 81 NON CONNECTÉ" >> /root/server_problem.txt
  else
    echo "NON CONNECTÉ" > /root/server_problem_first_time_443.txt
  fi
fi

### Tester DNS ###
$DIG $DOMAINTOCHECKDNS @$DNSSERVERIP | grep $DOMAINIP
if [ "$?" -ne "1" ]; then
  echo "PORT CONNECTÉ"
else
  if [ -f server_problem_first_time_53.txt ]; then
    echo "PORT 53 NON CONNECTÉ" >> /root/server_problem.txt
  else
    echo "NON CONNECTÉ" > /root/server_problem_first_time_53.txt
  fi
fi
### Envoyer une notification par mail après 2 vérifications échouées ###
if [ -f server_problem.txt ]; then
  $MAIL -s "Problème de serveur" $EMAIL < /root/server_problem.txt
fi

Et voilà ! N’hésitez pas à m’envoyer des emails privés à admin [at] marchost.com ou à poster des commentaires ici ou sur ma page : blogama.org

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.