Configuration et optimiser apache

Configuration et optimiser apache

Introduction

Apache est un serveur Web libre qui est ce jour le serveur Web le plus utilisé sur Internet.
Il est trés important de mettre à jour et d’utiliser une version récente d’apache car:

– De nombreux bugs de sécurité ont été corrigé
– Cette documentation traite de la configuration des derniers serveurs apaches. Dans les anciennes versions, il y avait trois fichiers (httpd.conf, srm.conf, access.conf) mais maitenant tous sont regroupés dans un même fichier:

httpd.conf.
Même si la compabilité avec les anciennes versions a été conservée (on peut toujours utiliser les anciens fichiers) je ne traite ici QUE du fichier httpd.conf.

Hostnamelookups

la directive HostnameLookups qui traduit les ips en noms d’hôtes ajoute un temps certains de latence entre chaque requête. HostnameLookups doit donc être à Off, mais vous n’aurez plus la traduction en hôte , délicat pour vos procédures de traçage des logs comme webalizer ou awstats ? Qu’à cela ne tienne : http://httpd.apache.org/docs/2.2/programs/logresolve.htmllogresolve est fait pour vous.

Dans votre fichier de configuration d’apache ,httpd.conf ,placez HostnameLookups à Off,et repérez votre fichier ou apache place ses logs d’entrées ,à savoir : access.log
saisissez ensuite : CustomLog /path/to/logs/access.log combined
Vérifiez que la première partie de chaque ligne correspond à l’adresse IP , c’est cette adresse qui sera traduite en nom d’hôte par logresolve à l’aide de la commande :
/path/to/logresolve -c < access.log > access_log.resolved le programme logresolve faisant partie d’Apache . Il faudra prévoir ici un certain temps de latence proportionnel à la longueur de votre fichier de logs . Ensuite il suffit de placer dans votre fichier de configuration de webalizer (ou autre analyseur de logs)
LogFile /home/deny/access_log.resolved sans oublier de relancer webalizer bien sûr .

Allowoveride

La directive AllowOverride all n’est valable que si un fichier .htaccess est placé dans le répertoire ou se trouve cette directive . Pour éviter qu’Apache ne cherche des fichiers .htaccess partout et soit sujet de ce fait à ralentissement ,placez cette directive à None partout ou il n’y a pas de fichiers .htaccess.

MaxClients

La directive MaxClients fixe la limite maximale des requêtes simultanées supportées par le serveur; Suivez la formule Total de la mémoire vive consacrée au serveur web / Taille maximale des processus fils.

KeepAlive et KeepAliveTimeout

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 TCP persistantes peut être supprimée en fixant KeepAlive à On.
Fixez de même une valeur basse à KeepAliveTimeout qui définit la durée d’attente de la prochaine requête.

La compression gzip avec apache2

gzip se sert du module mod_deflate ,installé par défaut avec apache2, pour servir des pages compressées ,ce qui en diminue la taille et augmente donc la vitesse.
Ouvrez votre fichier httpd.conf et vérifiez que vous avez la configuration suivante:

#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#

AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
# Ici sur les deux lignes enlever le caractère # pour activer le gZip Encoding.
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddOutputFilterByType DEFLATE text/php text/HTML text/txt
#Ajouter cette ligne pour ne compresser au format gZip que les extensions de page HTML suivante : .php .html .txt

Pour vérifier que le navigateur charge bien la page compressée , comparez le poids de votre page dans le navigateur,et son poids dans votre répertoire personnel .

Le caching avec apache Utiliser le cache permet de stocker une partie des données chez le client ,ou bien sur un serveur proxy. La bande passante du serveur sera donc épargnée . Ceci peut être effectué avec les modules mod_expires et mod_headers
Ouvrez votre httpd.conf et vérifiez que les modules suivants sont activés :

LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so

Pour activer le cache de vos sites ,une manière simple est de cibler vos fichiers par leurs extensions.
Positionnez ExpiresActive à on.

ExpiresActive On
<directory “=”” home=”” website=”” public_html”=””>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
ExpiresDefault A300
<filesmatch “.html$”=””>
expiresbyType text/html M604800

<filesmatch “.(gif|jpg|png|js|css)$”=””>
Expires A2592000
expiresbyType image/gif A2592000

ExpiresDefault A300 fixe le délai d’expiration par défaut à 300 secondes après l’accès (A). Si vous utilisez M300 , le délai d’expiration sera de 300 secondes après la modification du fichier. La directive FilesMatch fixe les en-têtes de contrôle du cache pour tout fichier .html à 604800 secondes après modification. La seconde section FilesMatch fixe les en-têtes pour les fichiers images, JavaScript et fichiers CSS à 2592000 secondes (30 jours).

Il existe aussi des outils comme httperf pour mesurer les performances du serveur : http://www.hpl.hp.com/research/linux/httperf/
Téléchargez l’archive et placez-la dans votre répertoire /usr/local Ensuite désarchivez-la avec

gunzip httperf-0.8.tar.gz
tar xvf httperf-0.8.tar

compilez en root avec

./configure
make
make install

Il est important de lancer un programme httperf par client , l’application étant gourmande en mémoire. Voici un test sur mon serveur

httperf –server linux-pour-lesnuls.com –port 80
httperf –client=0/1 –server=linux-pour-lesnuls.com –port=80 –uri=/ –send-buffer=4096 –recv-buffer=16384 –num-conns=1 –num-calls=1
Maximum connect burst length: 0
Total: connections 1 requests 1 replies 1 test-duration 0.057 s
Connection rate: 17.5 conn/s (57.3 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 57.3 avg 57.3 max 57.3 median 57.5 stddev 0.0
Connection time [ms]: connect 0.3
Connection length [replies/conn]: 1.000
Request rate: 17.5 req/s (57.3 ms/req)
Request size [B]: 73.0
Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 53.5 transfer 3.4
Reply size [B]: header 278.0 content 26444.0 footer 2.0 (total 26724.0)
Reply status: 1xx=0 2xx=1 3xx=0 4xx=0 5xx=0

et pour un test plus poussé
httperf –server linux-pour-lesnuls.com –port 80 –num-conns 100 –rate 10 –timeout 1
httperf –timeout=1 –client=0/1 –server=linux-pour-lesnuls.com –port=80 –uri=/ –rate=10 –send-buffer=4096
–recv-buffer=16384 –num-conns=100 –num-calls=1
Maximum connect burst length: 1
Total: connections 100 requests 100 replies 95 test-duration 10.502 s
Connection rate: 9.5 conn/s (105.0 ms/conn, <=6 concurrent connections)
Connection time [ms]: min 24.0 avg 62.5 max 458.0 median 26.5 stddev 83.9
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000
Request rate: 9.5 req/s (105.0 ms/req)
Request size [B]: 73.0
Reply rate [replies/s]: min 9.4 avg 9.5 max 9.6 stddev 0.1 (2 samples)
Reply time [ms]: response 58.6 transfer 3.9
Reply size [B]: header 278.0 content 26444.0 footer 2.0 (total 26724.0)
Reply status: 1xx=0 2xx=95 3xx=0 4xx=0 5xx=0
CPU time [s]: user 1.08 system 8.90 (user 10.3% system 84.7% total 95.0%)
Net I/O: 236.7 KB/s (1.9*10^6 bps)
Errors: total 5 client-timo 5 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
La ligne correspondant à Total donne le résumé du nombre de connexions initiées par le client du nombre de requetes envoyées et recues , et de la durée du test .
La ligne suivante indique que le taux de connexion a été de 9.5 par seconde, ce taux corresponds à une période de 99.1 milliseconds par connection. au cours duquel 6 connexions ont été initiées simultanément .
Je vous laisse consulter la documentation pour une explication détaillée des lignes suivantes .

Sources de l’article