Aller au contenu principal

ISPConfig : messages d’erreur récursifs quand MySQL est indisponible

Fiche écrite en 2017 et relue en 2026 : l’encadré en fin de fiche signale ce qui a changé depuis.

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 d’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 journal peut alors atteindre un poids de plusieurs gigaoctets en quelques dizaines de minutes. La lecture et l’écriture de ce même fichier par ISPConfig ralentissent d’autant. La charge système devient alors anormale et cela risque de mener à une indisponibilité totale du serveur dans les 24 heures (souvent au moment de la sauvegarde automatique de nuit). Il faudra alors procéder à un redémarrage à froid.

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

Texte
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.

Revoyons la scène au ralenti :

  1. Le serveur MySQL est indisponible (ou en cours de démarrage).
  2. Le cron d’ISPConfig insère 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’à ce qu’il finisse par tomber.

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 corrigez la portion de code de la manière suivante :

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