Sur les sites internet classiques aujourd’hui on trouve beaucoup de médias (vidéos, images, musiques…), des designs de plus en plus évolués et des interfaces utilisateurs de plus en plus travaillés. Sur un site internet on peut faire deux types d’optimisations, les optimisations « serveur » et les optimisations « client ». Alors pourquoi est-il important d’optimiser le temps de chargement de son site?
- 500 ms de plus lors d’une recherche Google et c’est 20 % de recherches en moins.
- 100 ms de temps de chargement à Amazon et vous perdez 1 % des ventes.
- Le temps de chargement d’une page internet rentre dans le critères de positionnement de Google.
Le but de cet article est de vous présenter quelques optimisations faciles à mettre en place qui vous permettrons de gagner un temps de chargement significatif. Par exemple en ayant appliqué ces méthodes sur Lezard Spock j’ai divisé le temps de chargement d’une page par cinq.
Utilisez des PNG Sprites.
Quand vous chargez un site internet votre navigateur doit faire une requête sur un serveur web. Le nombre de requête est multiplié par le nombre d’éléments à charger. Par exemple si votre site contient 5 images, un fichier CSS et un fichier JavaScript on se retrouve déjà avec 8 requêtes HTTP pour charger une page. Le fait d’utiliser des PNG Sprites permet deux choses, d’une part de diminuer le nombre de requêtes, et d’autre part d’alléger le poids de votre design/images.
Commençons avec un exemple. Je veux avoir ces 4 images sur mon site:

En utilisant une balise img classique pour chacune des images comme dans cet exemple, je me retrouve avec 5 requêtes HTTP pour un poids de 127KB et un temps de chargement de 424ms. En créant un pngsprite (voir ici) je me retrouve avec 2 requêtes HTTP pour un poids de 123KB et un temps de chargement de 385ms.
Optimisez vos images PNG
Il est également important de penser à optimiser les images PNG avec l’aide d’un logiciel comme optipng sous linux par exemple. Sur le sprite de dessus je gagne environ 10% (13617 bytes = 10.67% decrease). On arrive donc à un temps de chargement final de 365ms pour un poids total de 112KB.
Pour finir d’illustrer mon propos, voici le sprite de Lezard Spock (168 KB), il contient quasiment tout le design du blog. Pour appliquer cette technique à votre site vous pouvez regarder les sources de cette démo ou chercher PNG Sprite sur Google :)
Mettez vos fichiers CSS dans les headers de votre site
En mettant vos fichiers css entre les balises head de votre site vous permettrez aux navigateurs qui se connectent à votre site de générer plus rapidement le rendu de la page.
Minifiez et unifiez vos fichiers CSS
On à l’habitude de le faire avec le JavaScript, mais c’est important de le faire également avec les fichiers de style. Par exemple si vous avez style1.css et style2.css cela fait 2 requêtes HTTP. L’intérêt est limité si ces deux fichiers sont chargés sur toutes les pages de votre site. Il est clairement plus intéressant de faire un seul fichier styles.css. Même si tous les styles ne sont pas utilisés sur toutes les pages, le fichier sera mit en cache par les navigateurs web. Personnellement pour minifier rapidement mes fichiers CSS j’utilise le petit script PHP suivant:
function minify($content) {
$content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $content);
$content = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $content);
return $content;
}
Attention, n’utilisez pas ce script à chaque chargement de page, utilisez le comme un outil pour générer vos CSS. Sur Lezard Spock par exemple je gagne 23% sur la taille de mon fichier CSS.
Mettez vos fichiers JavaScript en fin de page
Il est inutile de bloquer une requête HTTP pour charger un JavaScript en haut de page, pensez à mettre vos fichier JS juste avant la fermeture de votre balise body.
Minifiez et unifiez vos fichiers JavaScript
Exactement de la même façon que pour les fichiers CSS il est intéressant de minimiser les fichiers JavaScript. Vous pouvez par exemple utiliser le minifieur de Douglas Crockford. Il existe une version PHP à l’adresse suivante: http://code.google.com/p/jsmin-php/.
Envoyez « Cache-Control » pour les fichiers statiques dans vos headers
Pour que la gestion du cache s’effectue correctement il est important d’envoyer des headers HTTP corrects. De base dans la configuration apache classique ces headers ne sont pas envoyés. Vous pouvez automatiser cette opération en activant le module headers d’apache (a2enmod headers). Et en rajoutant les lignes suivantes dans votre fichier de configuration apache ou dans votre .htaccess.
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=290304000, public" </FilesMatch>
Si vous utilisez Nginx pour vos fichiers statiques (ce que je recommande), vous pouvez utiliser ce code:
location ~* ^.+\.(js|css|php|jpg|jpeg|gif|png|pdf|zip|rar)$ {
root /home/www/;
expires max;
}
Utilisez un domaine différent pour vos fichiers statiques
Le fait d’utiliser un domaine différent pour les fichiers statiques (dans mon cas static.weelya.org) permet de paralléliser les requêtes HTTP sans entrainer un nombre de résolutions DNS trop important. Le gain est significatif. L’autre avantage est de ne pas transmettre les cookies de lezard-spock.com. Une économie minime certes, mais c’est toujours ça en plus.
Chargez les fichiers statiques avec Nginx si possible
Nginx est un serveur HTTP (tout comme apache) qui connait des performances bien meilleures pour l’envoie de fichiers statiques (css, js, jpg, png, etc….). Si vous possédez votre propre machine il est intéressant de créer un serveur Nginx (sur le port 8080 si vous n’avez qu’une seule IP). Par exemple le fichier suivant est servit par Nginx: http://static.weelya.org/lezard-spock/favicon.ico.
Évitez la diversité dans vos requêtes externes
Quand vous utilisez une image, une vidéo provenant d’un site externe, par exemple un compteur de visites, un webservice (gravatar par exemple) ou encore une vidéo Youtube, tout navigateur qui se connectera sur votre site internet devra charger ces éléments. Cela augment évidement le nombre de requêtes HTTP mais aussi le nombre de résolutions DNS. De plus, vous n’avez aucun contrôle sur les serveurs qui hébergent ces fichiers. Si possible, évitez ces chargements.
Activez le Mod_Deflate pour Apache 2
Pour cela activez le module deflate (a2enmod deflate) et ajoutez la configuration suivante:
<Location />
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|rar|flv|pdf|wmv)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
Header unset ETag
FileETag None
</Location>
Cela permet de compresser les fichiers envoyés par Apache.
Évitez les redirections HTTP
Évitez les redirections HTTP vous permet encore une fois de réduire le nombre de requêtes HTTP.
Pour résumer
En appliquant les différentes techniques cités ci-dessus, je suis passé de 6 secondes à environ 1 seconde pour le temps de chargement de la page d’accueil de Lezard Spock.
A retenir donc:
- Réduire: le nombre de requêtes HTTP
- Compresser: HTML, CSS, JavaScript
- Concaténer: CSS, JavaScript, Images
- Cacher: vos fichiers statiques
Utilitaires
Vous pouvez télécharger FireBug, PageSpeed et YSlow, ce sont des plugins pratiques pour l’optimisation coté front. Ci-dessous le résultat de l’analyse de ces plugins pour Lezard Spock. Oui, bon c’est pas parfait, mais c’est déjà pas mal :o

Répondre
Super complet.
Bravo pour l’article.
Moi qui voulais faire un article similaire avec les mêmes chiffres en intro c raté ^^ Avec le temps de chargement en compte dans les SERP on voit fleurir de + en + d’articles dans le genre mais j’avoue que celui ci est particulièrement complet ! Merci pour tout ça :)
Si une fois te viens l’envie d’en faire 1 plus orienté serveur avec config php aux petits oignons, Memcached, APC & Cie je prend volontiers car là je galère..
Ouais, je ferais ça si j’ai le temps. Merci pour ces commentaires :)
Merci aussi Eric Daspet : http://performance.survol.fr/
Je lis son blog et la synthèse que tu fais me rappelle beaucoup d’articles de son blog :)
Il retranscrit sur son blog pas mal d’articles que j’ai pu lire sur des blogs/pdf anglais – Mais oui les conseils qu’il donne sont pertinents :)
Yep c’est bien pour les non anglophones ^^
C’est quoi la raison pour laquelle tu n’as pas activé les ETags ?
Utilisant deflate et gzip les ETags seraient différents même si le contenu ne change pas, dans ce cas là et dans ce cas uniquement ils sont inutiles.
Ok, et admettons que les contenus statiques soient servis par un cache, çà résoudrait pas certains problèmes ?
Si, avec un Squid (ou nginx bien configuré) par exemple mais ce n’est pas le cas ici.
Merci pour tes précisions.
Sinon pour les utilisateurs de Windows je recommande PngOptimizer (il existe une version en ligne de commande sur le site), mais pour du png qui bouge pas à chaque commit je le trouve très bien.
http://psydk.org/PngOptimizer.php
Moi qui cherchait un petit tutoriel pour exploiter mes performances, je suis servi !
Merci :)
Bravo pour cet article très intéressant. Je ne savais pas que Google utilise déjà les performances du site pour le référencement même si on pouvait l’imaginer.
J’ai écrit un article sur ce sujet sur mon blog récemment dans lequel je parle de BrowserMob, un moyen de tester les performances d’un site internet. Il est possible de tester gratuitement le temps de chargement.
le lien si ca vous intéresse: http://www.apidev.fr/blog/2009/12/07/et-si-google-utilisait-les-tests-de-performance-pour-le-referencement/
Il va falloir que je pense à quelques optimisations sur mon site.
Est-ce que tu crois que les données de Google Webmaster Tools sont fiables concernant le temps de chargement d’un site (dans Performances de site)?
@refpro Essai un apache bench ou un test de montée en charge avec un outil gratuit comme jmeter et compare les 3 :)
Je pense qu’elles le sont mais pas encore assez régulièrement mises à jour. Tu peux utiliser les addons firefox que je donne dans l’article pour faire des tests. Après pour les tests de montée en charge c’est une autre histoire, mais comme l’a dit Salya, apache bench est pratique pour ce cas là :-)
Ah oui effectivement ! Merci pour cette article qui vient ajouter des options pour le téléchargement de mon blog.
Merci
Cet article est une bible =)
est-ce que minifier l’html aurait les même avantages que pour minifier le javascript et le css ?
Toutes ces propositions d’optimisations résument bien les principaux points que nous pouvons optimiser pour un site.
Mais l’utilité, la véritable prise en compte de cette partie dans l’algo de Google ? Personne le sait…
Oui, mais il ne faut pas oublier que le but principal est d’optimiser le temps de chargement pour le visiteur plus que pour les bots ;)
J’imagine mal Google donner un poids important au chargement des pages dans son algorithme de classement. D’autant que les pubs adsense ralentissent déjà énormément le chargement.
Essaye de bien imaginer.
Tu connais un logiciel pour optimiser ses images sous windows sans perdre trop en qualité ? Car sur des sites comme le mien, le nombre d’image peut être vite important, par conséquent l’optimisation est primordial.
Merci
http://www.lezard-spock.com/optimiser-le-temps-de-chargement-de-votre-site.html/comment-page-1#comment-1031
Vraiment génial cet article, j’ai appris beaucoup de détails pertinents. Merci!
De rien :-)
Merci pour cet article, ma page d’accueil est un peu trop lourde, il faut que je regarde ca de plus près.
c’est quelque ligne m’ont permis de rendre mon site vraiment speed.
je partage avec vous en complément de cet article:
AddOutputFilterByType DEFLATE text/html text/xml application/xhtml+xml text/plain application/javascript text/css
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*