Ispconfig : Messages d'erreur récursifs quand MySQL est indisponible

Dans les versions 3.1.2, 3.1.3, 3.1.4 et 3.1.5, Ispconfig peut rencontrer un dysfonctionnement lorsque le serveur SGBD est indisponible. Cela peut par exemple se produire au démarrage du serveur si les services d'Ispconfig démarrent avant le serveur MySQL.

(À noter que ce problème survient notamment lors de la mise à jour de Ispconfig.)

Lorsque ce problème se produit, cela peut provoquer une énorme quantité de messages d'erreur récursifs qui vont avoir pour conséquence de remplir le fichier /var/log/ispconfig/cron.log.

Ce fichier log peut alors atteindre un poids de plusieurs gigas en quelques dizaines de minutes. Ayant pour conséquence de ralentir la lecture et l'écriture de ce même fichier par Ispconfig. La charge système devient alors anormale et cela risque de mener à une indisponibilité totale du serveur dans les 24h (souvent au moment du backup automatique nocturne). Il faudra alors procéder à un redémarrage à froid.

Voici le style de messages d'erreur qui sont renvoyés lorsque cela se produit :

Thu Mai 16 04:30:06 CET 2017 PHP Warning:  mysqli_ping() expects parameter 1 to be mysqli, null given in /usr/local/ispconfig/server/lib/classes/db_mysql.inc.php on line 198
Thu Mai 16 04:30:06 CET 2017 PHP Warning:  mysqli_query() expects parameter 1 to be mysqli, null given in /usr/local/ispconfig/server/lib/classes/db_mysql.inc.php on line 182
Thu Mai 16 04:30:06 CET 2017 PHP Warning:  mysqli_query() expects parameter 1 to be mysqli, null given in /usr/local/ispconfig/server/lib/classes/db_mysql.inc.php on line 183
Thu Mai 16 04:30:07 CET 2017 PHP Warning:  mysqli_query() expects parameter 1 to be mysqli, null given in /usr/local/ispconfig/server/lib/classes/db_mysql.inc.php on line 228
Thu Mai 16 04:30:09 CET 2017 16.02.2017-02:49 - WARNING - Falsche Anfrage / Wrong QuerySQL-Query = INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message)

On peut voir que la dernière ligne fait mention d'une tentative d'écriture dans la table sys_log de la base de données d'Ispconfig. (wtf ??!!)

Revoyons la scène au ralenti :

 

  1. Le serveur MySQL est indisponible (ou en cours de démarrage).
  2. Le cron d'Ispconfig insert un message dans le fichier journal /var/log/ispconfig/cron.log pour signaler que le SGBD est indisponible.
  3. Ispconfig tente d'insérer un enregistrement dans la table sys_log du SGBD (indisponible !) afin de journaliser l'échec d'accés au serveur de base de données... et ainsi de suite.. 
  4. Le serveur ralentit jusqu'au moment où il finit par crasher.

 

Pour résoudre ce problème, rendez-vous aux alentours de la ligne 230 du fichier server/lib/classes/db_mysql.inc.php présent dans le dossier Ispconfig et corriger la portion de code de la manière suivante :

$this->_iQueryId = mysqli_query($this->_iConnId, $sQuery);
if (!$this->_iQueryId and !substr($sQuery, 0, 19) === "INSERT INTO sys_log") {
    $sQuery = strlen($sQuery) > 100 ? substr($in,0,100) . " [...]" : $sQuery;
    $this->_sqlerror('Falsche Anfrage / Wrong Query', 'SQL-Query = ' . $sQuery);
    return false;
}