Optimisation apache (mod_deflate, mod_expires, ETag)
Par NiCoS le mardi 16 septembre 2008, 10:43 - Trucs de geek - Lien permanent
Pour un projet interne JCDecaux, je me suis penché sur les optimisations du serveur afin d'améliorer ses performances.
Ci-après les résultats fournis par YSlow :
Pour le chargement de la page d'accueil, en version non optimisée :
- Sans cache (Empty cache) :
- Taille 223.7K
- Requêtes HTTP : 48
- Avec cache navigateur (Primed cache) :
- Taille : 53.5K
- Requêtes HTTP : 48
Pour le chargement de la page d'accueil, en version optimisée :
- Sans cache (Empty cache) :
- Taille 160K
- Requêtes HTTP : 48
- Avec cache navigateur (Primed cache) :
- Taille : 7K
- Requêtes HTTP : 8
Sur une RHEL 5.1, dotée de Apache 2.2, PHP 5.2.6 + APC, MySQL 5.0.x, cela donne les éléments suivants :
/etc/httpd/conf.d/mod_deflate.conf :
#
## Mod Deflate - http://httpd.apache.org/docs/2.2/mod/mod_deflate.html
#
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>
</IfModule>
/etc/httpd/conf.d/disable_etag.conf :
# ## Disable ETags as caching & co is handled by mod_expires & mod_deflate ## /!\ Gzipped items will not have the same etags (even if the content did not change). ## So they're useless in our configuration # # Remote ETag from headers - http://www.askapache.com/htaccess/apache-speed-etags.html Header unset ETag # Disable ETag for files FileETag None
/etc/httpd/conf.d/mod_expires.conf :
#
## Mod Expires - http://httpd.apache.org/docs/2.2/mod/mod_expires.html
#
LoadModule expires_module modules/mod_expires.so
<IfModule mod_expires.c>
# enable expirations
ExpiresActive On
# Default rule
ExpiresDefault "access plus 1 week"
# expire images after a month in the client's cache
ExpiresByType image/* "access plus 1 month"
# expire video after a month in the client's cache
ExpiresByType video/* "access plus 1 month"
# expire audio after a month in the client's cache
ExpiresByType audio/* "access plus 1 month"
# expire application after a month in the client's cache
ExpiresByType application/* "access plus 1 month"
# HTML documents are good for a week from the time they were changed
ExpiresByType text/html "modified plus 1 week"
ExpiresByType text/css "modified plus 1 week"
ExpiresByType text/javascript "modified plus 1 week"
</IfModule>
L'arbitrage entre access et modified est à voir selon vos besoins et le choix présenté ci-dessus est largement discutable. Il doit également être possible d'aller plus loin dans les optimisations mais dans mon cas d'espèce, le mieux étant l'ennemi du bien, je préfère m'arrêter là pour le moment.
Sauf erreur, la notation de votre site dans YSlow devrait significativement s'améliorer (dans mon cas d'exemple, passage de F à C et ce sans toucher à l'applicatif).
D'autres astuces à partager ?