De l’optimisation d’un site web

La question est vaste et c’est un travail quotidien : compression, réduction du nombre des requêtes, mise en cache, progression non obstrusive, parallélisation… Quelques points qui me paraissent essentiels et qui sont encore trop souvent délaissés.

L’optimisation d’un site web joue à chaque fois sur quelques millièmes de secondes. Ça peut paraître complètement dérisoire, ceci étant, je suis passé un affichage en 6 secondes pour la page d’accueil de ce blog à moins d’une seconde et demi. L’expérience utilisateur n’est plus tout la même !

Pour info Google prend officiellement en compte le temps de chargement d’une page web dans le classement des résultats de Google depuis le moins d’Avril.

Les outils pour tester la réactivité de vos sites

Pour vous donner un aperçu du temps de chargement de vos pages web, il existe plusieurs utilitaires, voici mes préférés :

Mise en cache des fichiers dynamiques

Les CMS actuels rivalisent de possibilités, souvent au prix de trop nombreux appels aux bases de données, fichiers XML et autres web services. L’idéal dans ces cas là est de continuer à se servir de la puissance du CMS mais de générer un fichier statique (ou en partie du moins) pour le servir à l’internaute. En règle générale, c’est là qu’on gagnera le plus gros du temps de téléchargement. Au passage, on déchargera le processeur et la base de données.
Sur un site que j’ai eu à gérer il y a maintenant bien longtemps, le CMS était franchement plan plan. A chaque fois qu’une page était modifiée ou créée, le fichier HTML correspondant était placé sur le serveur. C’est archaïque, mais c’était redoutable d’efficacité.
Aujourd’hui, la plupart des CMS proposent des systèmes de cache en natif ou via des plugins. Ce serait dommage de ne pas en profiter.

Comprimez tout ce qui peut l’être

Vous avez l’habitude de compresser vos images pour gagner en temps de téléchargement (et en bande passante) sans perte de qualité. Il est possible de faire la même chose avec les autres types de fichiers : la minification permettra de supprimer tous les espaces, tabulations, commentaires et autres sauts de lignes inutiles. C’est valable en javascript, CSS mais aussi en HTML même si c’est encore peu utilisé.
Attention toutefois à ne pas minifier vos fichiers de développement 😉

La compression peut doit aussi passer par des méthodes classiques. De plus en plus de navigateurs acceptent la compression gzip. Il est assez facile de paramétrer son serveur (même mutualisé) pour pouvoir transmettre les fichiers dans leur version compressée quand le client les acceptent. Pour info, sur un serveur mutualisé OVH, il suffit d’ajouter la ligne suivante en tête de votre fichier .htaccess à la racine de votre hébergement :

modgzipon On

Réduction du nombre de requêtes

Chaque fichier à télécharger crée une nouvelle requête vers le serveur, chaque nouvelle requête se décompose en plusieurs étapes : recherche du DNS, envoi de la demande, accusé de réception, recherche du fichier, envoi… Aussi rapide soient ces étapes, il est quand même intéressant d’éviter de les cumuler inutilement.

On vous a déjà dit mille fois de ne pas créer 12 fichiers CSS pour une même page et vous faites attention. Soit. S’il reste 2 ou 3 fichiers CSS regardez donc s’il n’y a vraiment pas moyen de les rassembler en un seul fichier, des fois que vous puissiez gagner une petite requête… Idem pour le javascript bien entendu.

Un peu moins répandu, il est aussi possible d’envisager la même méthode avec les images de votre thème. Puisque il s’agit de votre thème (et donc que vous ne mélangez pas fond et forme), ces images sont utilisées en background dans votre CSS, délimitées en hauteur et largeur, donc si l’image était plus grande, seule une partie serait visible. Regardez ce que fait Google sur sa page d’accueil : il ne charge qu’une seule image !

Progression non obstrusive

Certains javascripts peuvent bloquer le chargement d’une page tant qu’ils ne sont pas totalement chargés. C’était le cas de la première version de Google Analytics. Vous savez comme moi que le javascript est une couche complémentaire qui ne doit jamais être essentielle au bon fonctionnement d’une page web (ne serait-ce que pour les navigateurs dont le JS est désactivé). On peut donc charger la page sans son javascript et ne l’appeler qu’une fois le HTML chargé. L’internaute sera toujours plus enclin à attendre un peu s’il a quelque chose à se mettre sous les yeux 😉
N’hésitez pas à préférer un chargement AJAX ou à placer vos scripts en fin de page juste avant la fin de body.

Parallélisation des chargements

Le protocole HTTP limite théoriquement le chargement à deux fichiers simultanément, même si les navigateurs fourbent pour passer au-delà. Les fichiers sont chargés à la queue leu leu et ça peut prendre un brin de temps.
L’idée est d’utiliser d’autres noms de domaines pour contrer cette limitation. En soit, ça paraît compliqué et peu utile. Ceci dit, le Cloud computing nous permet d’avoir accès à des serveurs de réplication disséminés un peu partout dans le monde. Imaginez maintenant que non seulement vous puissiez permettre de charger plus de 2 fichiers à la fois, mais qu’en plus ces fichiers soient servis par un serveur proche de l’internaute, même s’il est à l’autre bout du monde. La technique devient d’un coup beaucoup plus intéressante.
Par ailleurs, cette technique (appelée CDN pour Content Data Network) permettra en outre d’utiliser des serveur qui refusent les cookies. Autant de requêtes économisées donc puisque le navigateur n’aura pas à vérifier la présence d’un éventuel cookies pour chaque fichier téléchargé. De surcroit, vous gagnerez en bande passante et en temps processeur sur votre propre serveur.
Bien entendu, cette technologie est à réserver à l’usage des fichiers statiques (CSS, javascript images, polices de caractères, etc.).

A l’heure actuelle, les CDN sont peu abordables au niveau tarif, mais peuvent dans certains cas améliorer sensiblement les choses.

Pour l’heure, en CDN gratuits, il existe essentiellement :

Je vous prépare un petit billet sur la mise en place d’un CDN via Google App Engine.
Je suis sûr que de votre côté, vous avez vous-aussi vos petites astuces. Comment gérez vous l’optimisation de votre site web ?

Illustration : cc Danard Vincente

5 commentaires

  • Amusant que tu fasses ton billet maintenant car je suis en plein dans une série d’optimisations à la fois sur le plan de page speed et sur le plan du serveur qui souffre quand même beaucoup en ce moment avec la charge.

    Pour la parallélisation tu peux le faire sans passer par un CDN. Moi je l’ai fait avec des sous-domaines (img0.domaine.xxx, img1.domaine.xxx) qui pointent sur le dossier image. Suffit alors de demander au CMS de répartir entre eux. Tu peux aussi faire une règle de réécriture spécifique à ton dossier images pour passer outre les limites des navigateurs.

    Je veux aussi regarder le plugin jQuery qui permet de charger les images au moment où tu es censée les voir.

    Enfin côté serveur j’essaie aussi d’alléger Apache et j’ai ajouté un serveur nginx pour serveur les fichiers statiques (images, css….). Mais la grande difficulté est bien d’arriver à cumuler l’ensemble des js et css quand on a plusieurs plugins.

    Pour l’instant j’ai gagné pas loin de 20 points de Page Speed sur cyberbougnat mais reste du taf.

    • A croire que nous sommes tous en train de nous battre pour obtenir ces bon vieux temps de réponse que nous n’avons plus vu depuis longtemps 😉

      Pour les sous-domaines, tu peux paralléliser effectivement, c’est une excellente idée sans coût supplémentaire. Je sens que je vais essayer ça ! Par contre, tu perd la proximité internaute / serveur, mais je pense que ça s’adresse essentiellement aux sites internationaux.

      Pour nginx et apache, malheureusement, je suis sur un serveur mutualisé (d’où aussi de gros besoins d’optimisation pour compenser les conneries des voisins). Ça fait longtemps que je lorgne les Kimsufi, mais j’hésite…

      Pour le plugin jQuery, c’est une excellente idée. Ça donne un petit effet sympa tout en délestant le serveur. Dans mon cas, je n’ai pas assez d’images pour que ce soit intéressant, par contre, c’est clair que dans le cas de CyberBougnat, il doit y avoir moyen 😉

      N’hésite pas s’il te vient d’autres idées dans ce goût là hein, je suis preneur !!

      • Difficile d’obtenir ces temps de réponse avec des pages qui pèsent pratiquement 1 Mo comme sur Cyberbougnat. Mon premier chargement de page fait 15s c’est un poil long. Après c’est autour de 4s c’est mieux.

        J’ai aussi fait des choix ergonomiques que j’assume : charger des polices Typekit pour avoir une belle police personnalisée

        Je dois regarder l’implémentation qui est possible avec Spip de faire un chargement par zone de page comme Facebook. Exemple : on charge header + texte principal puis le reste plus tard. (A un moteur tu balances un contenu complet).

        Mon problème actuel est cependant d’arriver à pister quelles sont mes scripts gourmands en ressources. Régulièrement un processus Apache à 100%. La solution Nginx a amélioré les choses car il ne travaille que pour calculer le PHP donc ça bloque moins, mais il me reste un problème.

        Si tu as une piste pour identifier ce processus je veux bien

        • 15s ??!? Ah oui… Yarglh !!
          100% du proc, pour moi, c’est plutôt une bonne nouvelle, ça veut dire qu’il peut prendre ce dont il a besoin. Après, la mauvaise nouvelle, c’est surtout qu’il en a besoin trop longtemps.
          Le php est un langage de trop haut niveau pour pouvoir facilement identifier un processus douteux. L’une des solutions pourrait consister à installer des chronos sur les plugins soupçonnés. Ça te donnera un temps d’exécution pour chacun et avec un peu de chance, ça te pointera le coupable.

          Pour tes polices, est-ce que tu te sers de tous les caractères (symboles et autres bizarreries) ? Est-ce qu’il ne serait pas possible d’en virer certains pour gagner un peu de poids ?

          Sinon, le chargement en différé est une excellente idée. Dans le même genre mais en plus facile à mettre en place, peut-être tenter un ou deux flush bien placés. Genre « tient, télécharge déjà ça pendant que je calcule le reste… » Mais ça ne résoudra pas le problème de fond, et gaffe avec ces trucs là, c’est tout ou (souvent) rien !

          J’ai jeté un oeil sur la Timeline, ça ne me paraît pas si dramatique que ça individuellement. Par contre, c’est clair qu’il y a du monde…

        • Au temps pour moi… Apparemment, PHP peut-être tracé. Je n’ai pas essayé mais peut-être que ceci pourrait t’aider à identifier tes soucis de montées en charge.
          http://xdebug.org/
          N’hésite pas à faire signe si c’est bien 😉

Ajouter un commentaire