En espérant que c'est une bonne question et qu'elle peut être utile à toute personne se trouvant dans une situation similaire. J'ai récemment succédé à un administrateur Linux très haut placé dans mon entreprise, et pour la première fois j'ai dû configurer un nouveau serveur pour servir notre contenu à nos clients. Mon prédécesseur a laissé une documentation limitée sur cette question, car d'autres choses étaient plus prioritaires au moment de son départ. Je me suis largement référé à la documentation que j'avais, ainsi qu'aux configurations des serveurs précédents et à beaucoup de lecture en ligne pour tout configurer.
La "pile" d'un serveur que je construis est la suivante: CentOS 7, Apache 2.4.6, MariaDB 5.X, Tomcat 7 desservant JSP/Servlets. Les installations précédentes pour la production utilisaient CentOS 5, une ancienne version d'Apache et MySQL et Tomcat 5.X.
Apache est le frontal, il utilise AJP pour se connecter à un backend Tomcat. La plupart du trafic sera HTTPS.
Le serveur est, je pense, un serveur HP Gen 9, il a 32 Go RAM et SSD dans une matrice RAID 1. Après l'avoir fait fonctionner, je suis maintenant soucieux de maximiser sa capacité à servir les utilisateurs simultanément, je m'attends à ce qu'une rafale de plusieurs centaines d'utilisateurs ne soit pas inhabituelle. À cette fin, j'ai cherché à éviter les goulots d'étranglement à tout moment de la pile: en commençant par Tomcat et MariaDB et en prenant des mesures spécifiques à ceux-ci, mesures avec lesquelles je suis Passons à Apache mais je trouve plus difficile de comprendre ce que je dois faire.
Il existe 3 types différents de "travailleurs" et j'ai 3 problèmes majeurs pour les optimiser:
1. Il existe trois options, prefork, mpm_worker et mpm_event. Je ne comprends pas vraiment comment les configurer, même si j'ai une compréhension générale de l'utilisation de chacun.
2. Contrairement à Apache dans les serveurs précédents, les options pour StartServers, ServerLimit, MaxRequestsPerChild, etc. ne sont pas répertoriées dans /etc/httpd/conf/httpd.conf. Pourrait-il y avoir des paramètres par défaut que je dois remplacer manuellement? Y a-t-il une raison autre que "ils ont été ajoutés manuellement la dernière fois" que les paramètres seraient trouvés dans un ancien httpd.conf mais pas dans un nouveau?
Je fais référence à cela, dans un ancien httpd.conf, je ne vois rien de similaire nulle part dans les nouveaux fichiers de configuration, seulement une spécification:
// préfork MPM
// StartServers: nombre de processus serveur à démarrer
// MinSpareServers: nombre minimum de processus serveur qui sont conservés en réserve
// MaxSpareServers: nombre maximal de processus serveur qui sont conservés en réserve
// ServerLimit: valeur maximale pour MaxClients pour la durée de vie du serveur
// MaxClients: nombre maximal de processus serveur autorisés à démarrer
// MaxRequestsPerChild: nombre maximum de requêtes servies par un processus serveur
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
// travailleur MPM
// StartServers: nombre initial de processus serveur à démarrer
// MaxClients: nombre maximal de connexions client simultanées
// MinSpareThreads: nombre minimum de threads de travail qui sont conservés en réserve
// MaxSpareThreads: nombre maximal de threads de travail qui sont conservés en réserve
// ThreadsPerChild: nombre constant de threads de travail dans chaque processus serveur
// MaxRequestsPerChild: nombre maximum de requêtes servies par un processus serveur
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
Notez que j'ai remplacé les signes de hachage par // pour signifier les commentaires dans le httpd.conf, car le signe de hachage fait apparaître le texte comme un en-tête.
Dans une inversion du problème que j'ai sur le nouveau serveur, je ne peux pas dire quel travailleur est utilisé sur l'ancien, il y a des paramètres pour prefork et mpm_worker, mais aucune spécification réelle à utiliser que je peux trouver.
Le serveur n'est pas encore en production, donc je n'ai pas la possibilité d'obtenir une utilisation moyenne de la mémoire sur un grand nombre de clients actuels pour aider à déterminer le nombre "parfait" de clients maximum, en outre, je ne suis pas concerné par l'obtention d'un nombre parfait, juste adéquat.
Si je veux m'assurer qu'environ 400 personnes, peut-être un peu plus, peuvent utiliser le serveur à un moment donné, sans que personne ne voie des erreurs de type http 500, quels sont les paramètres que je dois utiliser pour Apache?
Merci d'avance, j'espère que ce n'est pas trop nooby.
Il semble y avoir beaucoup de questions possibles ici, un peu non structurées pour une "réponse". Laissez-moi voir si je peux aider à répondre à certaines.
Déterminez quels modules de multi-traitement (MPM) sont utilisés.
Le moyen le plus "simple" consiste à vider tous les modules en cours d'exécution et à sélectionner ceux mpm
pour voir ce qui fonctionne. Voici deux méthodes:
# apachectl -M | grep mpm
mpm_worker_module (shared)
# httpd -V | grep MPM
Server MPM: worker
Modifier le MPM utilisé
Sur CentOS7, cela est désormais contrôlé dans un fichier de configuration nommé /etc/httpd/conf.modules.d/00-mpm.conf
. C'est un fichier court, et un seul LoadModule
doit être décommenté à tout moment.
LoadModule mpm_worker_module modules/mod_mpm_worker.so
Un redémarrage du service est requis après le changement pour activer le MPM souhaité.
Définissez vos valeurs de configuration souhaitées
De nombreuses directives de configuration du module ont des valeurs par défaut lorsqu'elles ne sont pas spécifiées. StartServers
utilisant worker
par défaut à 3, lors de l'utilisation de prefork
= 5. Voir plus ici: https://httpd.Apache.org/docs/current /mod/mpm_common.html#startservers . Je recommanderais de créer un nouveau fichier pour contenir vos remplacements au lieu d'en modifier un existant.
Quelque chose comme /etc/httpd/conf.modules.d/10-worker.conf
:
<IfModule mpm_worker_module>
ServerLimit 250
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 32
MaxClients 8000
MaxRequestsPerChild 10000
</IfModule>
Comme pour tout, régler les nombres exacts est laissé à vous de tester avec vos charges de travail et applications - des outils comme ab
et siege
peuvent vous aider.