Comment régler Apache sur le serveur Ubuntu 14.04

18

Actuellement sur mon Apache 2 (Apache 2.4.7 pour être exact) sur Ubuntu 14.04, j'ai ce paramètre:

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

<IfModule mpm_prefork_module>
StartServers                    20
MinSpareServers                 100
MaxSpareServers                 250
MaxRequestWorkers               150
MaxConnectionsPerChild          0
</IfModule>

Le serveur est un serveur Amazon de 8 Go (RAM) qui ne fait que charger un formulaire d'inscription de trois pages pour certaines campagnes publicitaires Google.

J'ai trouvé un script appelé apachetuneit.sh sur le Web, mais après un certain temps, Apache signalait cette erreur:

[Mar 21 avr 16: 45: 42.227935 2015] [mpm_prefork: erreur] [pid 1134] AH00161: le serveur a atteint le paramètre MaxRequestWorkers, envisagez d'augmenter le paramètre MaxRequestWorkers

Comment puis-je juger comment définir ces paramètres?

Je demande spécifiquement uniquement comment régler Apache 2.4 et rien d'autre. C'est pourquoi cette question est différente de cette question .

ServerChecker
la source
@JennyD Cet article est beaucoup trop large pour ce besoin spécifique.
ServerChecker
La façon dont vous jugez ces paramètres spécifiques consiste à effectuer des tests de charge.
Jenny D
@JennyD C'est encore plus simple que ça. Utilisez simplement le script ap.sh sous une charge régulière plusieurs fois dans la journée et en moyenne, faites le calcul selon le lien cloudinservice ci-dessous et définissez MaxRequestWorkers sur cette valeur. Ensuite, regardez les journaux Apache pour les problèmes avec MaxRequestWorkers et augmentez, ajoutez plus de RAM, ajoutez CloudFlare ou ajoutez un autre nœud Web. Pas besoin de faire des tests de charge extrêmement intenses.
ServerChecker
Vous pouvez écrire une réponse contenant des informations sur ce script, et des informations pertinentes à partir des liens que vous avez inclus dans votre propre réponse, à la question que j'ai désignée comme un double possible.
Jenny D

Réponses:

45
  1. Reconnaissez qu'Ubuntu 14.04 utilise Apache 2 avec PHP fonctionnant via un module mpm_prefork , dont un fichier modifiable se trouve dans /etc/apache2/mods-enabled/mpm_prefork.conf. De plus, sachez qu'à partir d'Apache 2.4, MaxClients est désormais renommé MaxRequestWorkers et que toute documentation concernant MaxClients doit être basculée vers MaxRequestWorkers.

  2. Arrêtez temporairement le service Web Apache avec la commande suivante:

    sudo service apache2 stop
  1. Attendez 5 secondes, puis exécutez la commande suivante pour connaître la quantité de mémoire virtuelle disponible sur le serveur:
    sudo free -ht

Lisez la ligne Mem: et regardez la colonne gratuite. Considérez cela comme la quantité de RAM que vous pouvez dédier à Apache, bien que j'aime généralement déduire 2 Go sur un serveur plus costaud (comme dans> 4 Go), ou 1 Go sur un serveur plus léger. Donc, si la colonne gratuite disait que j'avais 13 Go gratuits, je recommanderais de donner Apache 11 Go. C'est une référence. Si nous rencontrons occasionnellement un problème de base de données dans les journaux (comme 3 fois dans les journaux sur une période de 3 jours) avec lequel il a besoin de plus de mémoire, alors nous pourrions considérer que nous n'avions que 10 Go pour jouer au lieu de 11 Go (dans ce cas ). Si nous rencontrons dans les journaux Apache que le serveur a besoin de plus de MaxRequestWorkers, alors c'est un problème distinct que j'aborderai ci-dessous.

  1. Démarrez le serveur Web Apache.
    sudo service apache2 start
  1. Ouvrez comme 10 onglets de navigateur, connectez-vous à certaines de vos pages de chargement plus longues ou plus lentes à partir de votre site Web et actualisez-les 3-4 fois sur chaque onglet.

  2. Après cela, exécutez rapidement la commande suivante:

    sudo ps -ylC apache2 | awk '{x + = 8 $; y + = 1} END {print "Utilisation de la mémoire Apache (Mo):" x / 1024; imprimer "Taille moyenne du processus (Mo):" x / ((y-1) * 1024)} '

Exécutez-le comme 5 fois rapidement.

Regardez la valeur de la taille moyenne du processus et faites la moyenne de cette valeur parmi les 5 fois où vous l'avez exécutée.

Faites maintenant le calcul suivant et assurez-vous de convertir GB en Mo si nécessaire afin que tous les nombres soient en valeurs MB. Donc, multipliez par 1024 ou divisez par 1024, selon le chemin à parcourir.

MaxRequestWorkers = Baseline Free (avec espace tampon) / Taille de processus moyenne

Par exemple, j'avais un serveur de 14 Go, mais quand Apache a été arrêté, le serveur a montré qu'il utilisait 1 Go de RAM en veille. Je fournis ensuite un autre 1 Go dans un espace tampon supplémentaire pour le système d'exploitation au cas où il en aurait besoin. Cela signifie que j'aurais une ligne de base sans 12 Go. Maintenant, je dois le convertir de Go en Mo, et donc je multiplie 12 x 1024 et j'obtiens 12288. Le 12288 Mo est ma valeur Baseline Free. Dans mon cas, j'ai vu que la taille moyenne du processus était de 21 Mo. Donc, je prends 12288/21 et j'obtiens environ 585. Maintenant, il est courant que les sysops arrondissent cette valeur, et j'ai donc obtenu 580.

  1. Modifiez le fichier /etc/apache2/mods-enabled/mpm_prefork.conf et envisagez de le définir sur les valeurs par défaut suivantes, en remplaçant XXX par votre calcul MaxRequestWorkers:


`<IfModule mpm_prefork_module>`
  StartServers                    2
  MinSpareServers                 2
  MaxSpareServers                 5
  MaxRequestWorkers               XXX
  ServerLimit                     XXX
  MaxConnectionsPerChild          0
</IfModule>

Notez que vous ne pouvez pas y voir le paramètre ServerLimit. Ajoutez-le. Ce paramètre par défaut à 256 s'il n'est pas présent, mais doit avoir la même valeur que MaxRequestWorkers ou vous obtiendrez une erreur.

  1. Un autre facteur critique dans votre configuration Apache est le fichier /etc/apache2/apache2.conf avec la variable Timeout et est mesuré en secondes. Il s'agit de la durée pendant laquelle vous pouvez envoyer ou recevoir du serveur avant son expiration. Vous devez également garder à l'esprit un téléchargement de fichier ou un téléchargement de fichier, comme si vous avez un site Web où les gens peuvent télécharger ou télécharger CSV ou d'autres fichiers volumineux, par exemple. Et vous devez garder à l'esprit un serveur de base de données occupé et où vous devrez peut-être prévoir un certain temps avant l'expiration des pages. Plus la variable Timeout est petite, plus le serveur Web est disponible pour recevoir de nouvelles connexions. Notez, cependant, que la définition de cette valeur trop basse peut causer des ravages avec les variables de session PHP, mais pas avec les cookies basés sur la session du navigateur. Ainsi, par exemple, une valeur de 300 (5 minutes) peut être bonne pour un serveur Web qui s'appuie sur des variables de session PHP pour le flux de travail de l'application Web au lieu des cookies de session du navigateur. Une valeur de 45 pourrait être bonne pour un serveur Web qui ne sert rien de plus que des pages de destination de publicité statique, mais serait terrible pour un serveur qui a besoin d'utiliser beaucoup de variables de session PHP. Modifiez donc le paramètre Timeout de ce fichier selon la quantité dont vous avez besoin. Cela peut prendre quelques tests avec toutes vos pages Web pour voir si la valeur est trop faible. Cependant, c'est probablement une bonne idée de ne pas le définir à plus de 300, sauf si vous rencontrez des problèmes lors de téléchargements de fichiers volumineux ou de téléchargements de fichiers volumineux. mais ce serait terrible pour un serveur qui a besoin d'utiliser beaucoup de variables de session PHP. Modifiez donc le paramètre Timeout de ce fichier selon la quantité dont vous avez besoin. Cela peut prendre quelques tests avec toutes vos pages Web pour voir si la valeur est trop faible. Cependant, c'est probablement une bonne idée de ne pas le définir à plus de 300, sauf si vous rencontrez des problèmes lors de téléchargements de fichiers volumineux ou de téléchargements de fichiers volumineux. mais ce serait terrible pour un serveur qui a besoin d'utiliser beaucoup de variables de session PHP. Modifiez donc le paramètre Timeout de ce fichier selon la quantité dont vous avez besoin. Cela peut prendre quelques tests avec toutes vos pages Web pour voir si la valeur est trop faible. Cependant, c'est probablement une bonne idée de ne pas le définir à plus de 300, sauf si vous rencontrez des problèmes lors de téléchargements de fichiers volumineux ou de téléchargements de fichiers volumineux.

  2. Redémarrez maintenant votre service Web Apache. Si vous avez fait quelque chose de mal, Apache vous en informera probablement au moment où vous le redémarrerez et vous pourrez y remédier.

    sudo service apache2 restart
  1. Maintenant, répétez l'astuce du navigateur à 10 onglets que vous avez faite précédemment et voyez si vous rencontrez des erreurs de configuration Apache dans le journal des erreurs du serveur Web Apache:
    sudo tail -f /var/log/apache2/error.log

... appuyez sur CTRL + C pour sortir de cela, si vous le souhaitez.

Recherchez une plainte concernant le besoin de MaxRequestWorkers (et récemment depuis que vous avez redémarré le serveur Web). Si vous voyez que même avec un paramètre MaxRequestWorkers optimal, vous avez probablement besoin de plus de puissance de feu pour vos sites Web ou applications Web. Considérez ces options:

  • Utilisation d'un CDN pour les téléchargements de fichiers volumineux, les images et les scripts.
  • Utilisation d'un service de mise en cache comme CloudFlare ou autres.
  • Refaire votre stratégie de site Web ou d'application Web pour utiliser plusieurs serveurs Web agissant comme une «application Web» derrière un équilibreur de charge.
  • Ajout de plus de RAM au serveur, et donc recommencer ce calcul.

  1. Maintenant que le serveur Apache est réglé, c'est en quelque sorte réglé de base. Vous devrez le vérifier au cours des 2-3 semaines et rechercher les problèmes de MaxRequestWorker dans les journaux d'erreurs Apache. À partir de là, vous pouvez prendre une décision d'optimisation (voir l'étape 10). Vous pouvez également installer Munin avec apt sur Ubuntu et examiner les performances d'Apache au fil du temps et tracer une idée de la croissance avant de décider de faire quoi que ce soit concernant la quantité de trafic que le serveur Web gère.
ServerChecker
la source
«Bien que ces liens puissent répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change. »
Jenny D
@JennyD Bon point! Je ferai ça.
ServerChecker
@Moderator J'ai besoin d'aide pour le formatage de cette réponse. L'étape 7 était censée être un fichier conf avec des retraits. L'étape 11 n'était pas censée être mise en retrait. Les commandes de code qui commencent par sudodoivent être affichées sous forme de code et non sous forme de texte normal. J'ai suivi la documentation sur le formatage, mais j'ai encore du mal ici.
ServerChecker
1
J'ai fait ce que j'ai pu - le démarquage ne fait vraiment pas très bien les listes mixtes et le code, mais je pense que j'ai quand même réussi à l'améliorer un peu.
Jenny D
pour les débutants centos comme moi: ps -lyU apache au lieu de ps -ylC apache2
user1928596
3

Ce à quoi vous pouvez augmenter MaxRequestWorkers dépend de la quantité de RAM que chacun de vos processus httpd / apache occupe. Si chacun prend 50 Mo (il suffit de choisir un nombre aléatoire), toutes les 20 demandes de travail que vous utilisez en même temps (c'est-à-dire les connexions simultanées) prendront 1 Go. Donc, dans cet exemple, vous pourriez avoir au plus 8 Go * 20 = 160 MaxRequestWorkers. Cependant, vous ne pouvez pas utiliser toute la RAM pour apache, vous devez en réserver pour d'autres choses qui s'y déroulent. Il peut également être utile de laisser un peu de RAM disponible pour les performances, car le système d'exploitation l'utilisera pour mettre en cache les choses et accélérer les performances (bien qu'il soit préférable de ne pas manquer de connexions par rapport au serveur étant très rapide car le site apparaîtra lent pendant que les navigateurs des utilisateurs attendent qu'une connexion soit disponible s'ils sont tous utilisés).

g491
la source
Quelle est la bonne façon de profiler cela? Quelles commandes puis-je taper pour voir combien de RAM chaque processus Apache utilise sous charge? Nous avons également besoin de RAM pour MySQL (un site WordPress) et des processus système normaux également.
ServerChecker
Voir combien de processus sont en cours d'exécution et exécutez la freecommande pour obtenir une ligne de base de mémoire. Augmentez ensuite le nombre de processus en cours d'exécution en augmentant MinSpareServers, en redémarrant apache, en exécutant à freenouveau et en faisant le calcul. Consultez moreofless.co.uk/apache-memory-usage pour plus de détails et d'explications.
g491
J'ai maintenant appris qu'il existe un moyen super rapide de le faire. Il est décrit dans le lien cloudinservice.com dans ma réponse ci-dessous. La commande est ap.sh que quelqu'un a trouvée. En outre, j'ai appris que MaxClients a maintenant été renommé MaxRequestWorkers dans Apache 2.4+.
ServerChecker