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.
Arrêtez temporairement le service Web Apache avec la commande suivante:
sudo service apache2 stop
- 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.
- Démarrez le serveur Web Apache.
sudo service apache2 start
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.
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.
- 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.
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.
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
- 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.
- 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.