Redémarrer automatiquement Apache/MySQL avec monit

Sur un serveur web LAMP il peut arriver que la processus Apapche 2 ou MariaDB/MySQL se termine de façon anormale ou soit terminé par OOM Killer.

Pour surveiller ces processus il existe monit qui est très simple d’utilisation. Voici comment l’installer sur un Ubuntu Server 22.04 :

sudo apt install monit

Aller dans le répertoire de configuration de monit :

cd /etc/monit/conf.d/

Créer un fichier pour Apache, apache.conf contenant :

check process apache with pidfile /run/apache2/apache2.pid
    start program = "/usr/sbin/service apache2 start"
    stop program = "/usr/sbin/service apache2 stop"
    if failed host 127.0.0.1 port 80 protocol http then restart
    if 5 restarts within 5 cycles then timeout

Créer un second fichier pour MariaDB/MySQL, mysql.conf :

check process mysqld with pidfile /run/mysqld/mysqld.pid
    start program = "/usr/sbin/service mysql start"
    stop program = "/usr/sbin/service mysql stop"
    if failed host 127.0.0.1 port 3306 protocol mysql then restart
    if 5 restarts within 5 cycles then timeout

Puis redémarrer monit et vérifier que celui-ci fonctionne bien :

sudo service monit restart
sudo service monit status
● monit.service - LSB: service and resource monitoring daemon
     Loaded: loaded (/etc/init.d/monit; generated)
     Active: active (running) since Wed 2023-06-07 08:14:53 CEST; 4s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 58545 ExecStart=/etc/init.d/monit start (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 9518)
     Memory: 1.7M
        CPU: 31ms
     CGroup: /system.slice/monit.service
             └─58551 /usr/bin/monit -c /etc/monit/monitrc

Jun 07 08:14:53 ip-172-31-26-128 systemd[1]: Starting LSB: service and resource monitoring daemon...
Jun 07 08:14:53 ip-172-31-26-128 monit[58545]:  * Starting daemon monitor monit
Jun 07 08:14:53 ip-172-31-26-128 monit[58545]:    ...done.
Jun 07 08:14:53 ip-172-31-26-128 systemd[1]: Started LSB: service and resource monitoring daemon.

Et voilà, c’est en place. monit vérifie toutes les 2 minutes que les processus fonctionnent et les redémarre si besoin.

Recopier les bases données d’un serveur MySQL/MariaDB vers un autre

Voici un script Bash très simple qui permet de migrer toutes les bases de données d’un serveur MySQL/MariaDB vers un autre serveur.

Celui-ci peut servir par exemple pour migrer vers un serveur AWS RDS.

#!/bin/bash

# configuration de la machine hébergeant le serveur MySQL source
DB_HOST_PROD="srv.source.com"
# configuration de l'utilisateur MySQL et de son mot de passe
DB_USER_PROD="root"
DB_PASS_PROD="PASSWORD"

# configuration de la machine hébergeant le serveur MySQL de destination
DB_HOST_RDS="srv.dest.com"
# configuration de l'utilisateur MySQL et de son mot de passe
DB_USER_RDS="admin"
DB_PASS_RDS="PASSWORD"

# récupération de la liste des bases
DATABASES=`MYSQL_PWD=$DB_PASS_PROD mysql -h $DB_HOST_PROD -u $DB_USER_PROD -e "SHOW DATABASES;" | tr -d "| " | grep -v -e Database -e _schema -e mysql`
# boucle sur les bases pour les dumper
for DB_NAME in $DATABASES; do
    # Pour créer les bases de données
    echo "create database if not exists $DB_NAME;" | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS

    now=$(date +"%T")
    echo $now $DB_NAME
    #MYSQL_PWD=$DB_PASS_PROD mysqldump -u $DB_USER_PROD --column-statistics=0 --single-transaction --skip-lock-tables $DB_NAME -h $DB_HOST_PROD | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS -D $DB_NAME # en fonction de la version de MySQL/MariaDB
    MYSQL_PWD=$DB_PASS_PROD mysqldump -u $DB_USER_PROD --single-transaction --skip-lock-tables $DB_NAME -h $DB_HOST_PROD | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS -D $DB_NAME
done

Résoudre les erreurs 500 Apache/PHP

Il est parfois difficile de savoir d’où proviennent les erreurs 500 d’un serveur Apache / PHP. Quand il n’y a rien dans les logs par exemple.

Une solution est d’ajouter temporairement les lignes suivantes dans un fichier inclus « partout » dans votre projet, un fichier de configuration par exemple.

error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 1);

Cela affichera directement les erreurs dans le navigateur.