Comment résoudre l’erreur « server reached MaxRequestWorkers setting » de votre serveur web Apache

Bonsoir,

Pour régler cette erreur, cela m’a pris une bonne demi-heure de recherche sur le web. Et pour comprendre le problème, je gère un serveur dédié qui héberge quelques sites e-commerce avec beaucoup de trafic et d’un coup, tous ces sites ne répondaient plus.

À la recherche de la source du problème sur mon serveur web Apache
Au début, j’ai pensé que c’était un problème lié à cloudflare et à ses services qui pouvaient être en panne à tout moment pour quelques minutes sans qu’on le sache.

J’ai désactivé cloudflare mais le problème persistait toujours et les sites de mes clients ne se chargeaient pas correctement avec une lenteur catastrophique voire même une indisponibilité totale.

Mon deuxième réflexe face à ce problème a été de redémarrer tout simplement le serveur Apache avant de décider si je redémarrais toute la machine avec un hard reboot ou non. Et là, tout revenait en ordre mais juste pour quelques secondes par magie avant que le problème ne revienne encore une fois.

J’ai pensé immédiatement à une attaque DDOS, un piratage de mon serveur ou même un problème DNS au niveau du datacenter qui héberge mon serveur dédié. Cela m’a poussé à fouiller quelques logs mais rien d’inquiétant à part un message d’erreur « server reached MaxRequestWorkers setting » dans les logs du serveur Apache et pour être précis le fichier /var/log/apache2/error.log.

Oops !! Le serveur web Apache venait d’atteindre la limite du nombre de requêtes simultanées et tout le reste des tentatives de connexion au-dessus de la limite était mis en file d’attente. Cela expliquait tout, la lenteur et l’indisponibilité des sites e-commerce de mes clients.

Qu’est-ce que le paramètre MaxRequestWorkers ?
Le serveur Apache est modulaire et il est possible d’y ajouter ou supprimer des fonctionnalités et des modules afin de l’optimiser pour un meilleur temps de chargement des sites qu’on héberge sur ce serveur. Ce sont les modules multi-traitements (Multi-Processing Modules) alias MPM qui nous permettent cette possibilité.

Le rôle de ces MPM comme indiqué sur le site de la fondation Apache.org est d’assurer la liaison et l’association aux ports réseau de la machine, accepter les requêtes, et se charger de répartir ces dernières entre les différents processus enfants.

Il existe un certain nombre de MPM comme MPM Worker, MPM Event, MPM Prefork, ainsi de suite et avec une multitude de paramètres et de nombreuses valeurs MPM. L’une de ces valeurs MPM est MaxRequestWorkers et c’est la clé pour résoudre notre problème.

MaxRequestWorkers est un paramètre pour définir la limite du nombre de requêtes simultanées (des connexions) que le serveur apache doit servir en même temps. Si cette valeur définie est trop basse, il y aura des lenteurs dans le chargement des pages pendant les heures de pointe. Et si elle est trop élevée, Apache dépassera les limitations matérielles et peut entraîner un plantage du serveur.

Par défaut et dans le MPM prefork (dans /etc/apache2/mods-enabled/mpm_prefork.conf), cette valeur est à 256 et dans le cas de mon serveur je l’ai trouvée à 100 seulement donc vous savez déjà ce qu’il faut faire pour résoudre le problème.

Mais attention, tout en augmentant la valeur de MaxRequestWorkers, vous devez également augmenter la valeur de ServerLimit.

Pour modifier ces deux valeurs, j’ai ouvert le fichier en question avec Vim avec la commande suivante :

vi /etc/apache2/mods-enabled/mpm_prefork.conf

Ensuite j’ai changé les valeurs MaxRequestWorkers et Serverlimit et je les ai mises à 500 chacune puis j’ai redémarré le serveur Apache à l’aide de la commande :

service apache2 restart

Cela a résolu l’erreur « server reached MaxRequestWorkers setting » et les sites sont à nouveau accessibles et plus rapides qu’avant avec un temps de réponse serveur satisfaisant.

J’espère que cela vous a été utile. :blush: