Optimisation Apache2
Par Yoann le vendredi, 13 avril 2007, 14:25 - L1nuX and c0 - Lien permanent
Aujourd'hui, c'est changement de hardware (Bi-Xeon 3,2 Ghz) et nouvel OS (Debian Etch) pour le serveur Web de ma boite.
Je profite de ce changement, pour optimiser la configuration de apache2.2.
Bonne lecture, et surtout n'hesitez pas à faire des remarques, (je suis loin d'être un expert apache) :-)
Résolution DNS : HostnameLookups
La directive HostnameLookups qui traduit les IPs en noms d'hôtes ajoute un temps certains de latence entre chaque requêtes. Je vous conseil très fortement de mettre la valeur de cet directive a Off.
HostnameLookups Off
Vous n'aurez plus la traduction en hôte dans les fichiers de logs, ce qui n'est pas cool pour l'analyse des logs avec des logiciels tel que webalizer ou awstats.
Je vous conseil d'ailleur d'analyser des logs, sur une autre machine, et vous pourrez dans probleme pre-traiter vos fichiers de logs afin d'y faire apparaitre les noms d'hote avec l'outil logresolve
Timeout
La directive Timeout fixe le temps (en ms) d'attente maximum du serveur d'une réponse à une requete envoyée à un programme extérieur (comme un gestionnaire de base de données)
Timeout 300
Les fichiers .htaccess : Allowoveride
La directive AllowOverride permet ou non de l'utilisation de fichiers .htaccess pour spécifier des directives supplémentaires.
Lorsque AllowOverride à pour valeur all apache recherche les fichiers .htaccess dans tous les dossiers accédés et cela rajoute bien-sûr une petite latence.
Je vous conseil donc de placer cette directive à None, et de mettre vos directives supplémentaires en dur dans le fichier de configuration du vhosts.
AllowOverride none
Requêtes persistantes : KeepAlive
La directive KeepAlive est utilisée dans le cas de requêtes persistantes. Cela sert pour des pages HTML avec beaucoup d'images. La surcharge causée par les connexions persistantes peut être supprimée en fixant KeepAlive à On.
Fixez de même une valeur basse à KeepAliveTimeout qui définit la durée (en seconde) d'attente de la prochaine requête, et une valeur moyenne à MaxKeepAliveRequests qui définit le nombre maximum de requetes pendant une connexion persistante.
KeepAlive On KeepAliveTimeout 5 MaxKeepAliveRequests 100
Augmenter le nombre de clients définissable: ServerLimit
La directive ServerLimit permet d'overrider la valeur par default qui vous limite à 256 clients.
ServerLimit 400
Nombre de clients : MaxClients
La directive MaxClient permet de définire le nombre maximum de clients pouvant se connecter au serveur.
MaxClients 400
Il est possible que l'optimisation de ces paramètres ne soit pas la solution exact, car un serveur avec 256 Mo RAM ne pourra sans doute pas assumer une charge de 2048 MaxClient.
Processus enfants : MinSpareThreads, MaxSpareThreads, MaxRequestsPerChild
Les directives MinSpareThreads et MaxSpareThreads permettent de déterminer le nombre de processus enfants.
Attention de bien équilibrer le MinSpareThreads par rapport au MaxSpareThreads. On devrait avoir un ratio de 4 afin de ne pas générer plus de 4 enfants.
Si MinSpareThreads est trop bas apache génèrera trop de processus enfant et consommera beaucoup de mémoire ram.
La directive MaxRequestsPerChild permet de définir le nombre de requetes maximum pour chaque processus. N’hésitez pas à en mettre un certains nombre.
MinSpareThreads 70 MaxSpareThreads 300 MaxRequestsPerChild 4000
Récapitulatif
Voici un récapitulatif des explications ci-dessus.
HostnameLookups Off Timeout 30 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 ServerLimit 400 <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 70 MaxSpareServers 300 MaxClients 400 MaxRequestsPerChild 4000 </IfModule> <IfModule mpm_worker_module> StartServers 5 MaxClients 400 MinSpareThreads 70 MaxSpareThreads 300 ThreadsPerChild 0 MaxRequestsPerChild 4000 </IfModule>
Et dans vos fichiers de définition de Virtual Host n'oubliez pas de spécifier :
AllowOverride none
Commentaires
Très bon article.
Mais comment savoir combien mettre à serverLimit ?
Sur Un Bi Xéon double coeur avec 6 go de Ram ? 1024 peux passer ? 2048 ?
Bon, j'arrive un peu tard, mais qu'importe.
Le meilleur ServerLimit / MaxServers se trouve généralement de manière expérimentale, et dépends de la configuration d'Apache. Regardez du côté de mod_status pour afficher un bilan de l'utilisation des slots, ca permet de déterminer si on est en manque, ou en surplus de slots (second cas qui n'est guère mieux).
Si votre Apache est lourd (PHP intégré et quelques autres lourds modules), il faut se limiter à des valeurs raisonnables de sorte que la machine ne swappera pas (les miens avec 6 Go, je ne mettrai même pas 800 slots).
Si votre processus Apache est léger, vous pouvez peut-être en mettre 1024 ou 2048, voire plus si vous faites du statique pur. Même si j'aurai tendance à dire que si c'est pour servir des pages statiques, il vaux mieux préférer lighttpd...
Il peut aussi être intéressant de creuser du côté des FastCGI et/ou utiliser un reverse proxy quand on gère de gros sites (ce qui doit être le cas avec ce genre de serveurs). Et virer le KeepAlive quand on manque de mémoire, ce qui est souvent le cas.
Tout d'abord bonjour,
est-ce que tous ces conseils sont également applicables sur un serveur faisant tourner apache 1.3?
Et quelles sont les différents outils ou commandes permettant de diagnostiquer un problème de configuration au niveau des ressources lié à apache (mémoire, utilisation du swap, trop grand nombre de client ...)?
Merci de votre aide
Bonjour,
j'ai un soucis avec un serveur dédié, il y a une coupure d'environs toute les heures de 2 à 3 min. Résulat : apache et ssh innacessible.
Avez vous eu des soucis de ce genre auparavant ?
Bonjour,
Je ne suis pas d'accord avec ce que tu écris sur MinSpareServers et MaxSpareServers.
Selon la doc Apache et ce que j'en ai compris...
MinSpareServers est le nombre minimum de proc idle. Donc le nombre en attente d'une connexion d'un client. Apache prendra soin d'avoir tjrs son nombre de proc actifs + MinSpareServers qui attendent. Si le nombre de proc idle est insuffisant, Apache en créera 1 toutes les secondes.
Pour MaxSpareServers, c'est le nb max de proc idle. Il ne faut pas en avoir trop car on consomme du CPU et de la mémoire pour rien. Apache tuera les procs idle jusqu'à cette limite si le nb de proc idle la dépasse.
A+
Merci pour le billet, fort utile ;)
Merci pour cet article, j'ai mis en place cette optimisation et ça a l'air de mieux marcher
Bonjour,
J'ai quelques problèmes à définir une configuration optimale pour mes serveurs apaches. Pour la simple et bonne raison que les testes apache benchmark que j'effectue sont trés aléatoires. Je peux ainsi, avec la même config me retrouver à 6000 req/sec et le coup d'apres à 1500. Il y a t'il une démarche à suivre pour que les tests réalisés soit fiable?
Cordialement,