Optimisons Wordpress - Partie 1

Attention, cet article a été posté en 2010. Il est possible que les informations mentionnées ne soient plus d'actualité, ou que mon opinion ait évolué. Merci d'en tenir compte lors de votre lecture.

Note : Ce billet a été rédigé par Aurelie. Elle est notamment à l'origine de cette 2eme version d'ilonet, basée sur un Wordpress décortiqué et optimisé.

Julien vous en avait parlé dans ce billet, je me suis proposée pour écrire un petit article sur l’optimisation de Wordpress. Article qui a été rédigée en Guest Blogging donc, vu que je ne suis pas chez moi ici. J’ai essayé de suivre les conseils que j’ai pu gratter à droite et à gauche, mais rédiger un article sur un blog n’est pas une opération courante pour moi. J’espère que vous saurez être indulgents.

Première chose, la longueur de l’article. Je me suis rendu compte que j’avais beaucoup de choses à dire, énormément de choses à dire, et que rédiger un pâté de deux cents pages n’était pas forcément une bonne idée. Et comme toutes les optimisations ne se font pas au même niveau, je vais plutôt diviser cet article en une série de plusieurs petits. Ca me donnera l’occasion de m’entrainer un peu, pour essayer peut être de devenir un jour une vrai blogueuse ?

Entrons dans le vif du sujet, parlons Wordpress, parlons optimisation. Comme je l’ai dit, c’est le premier article d’une longue série. Il se concentre donc uniquement sur les premières mises en garde, les premières choses à toucher sur Wordpress pour l’optimiser. Les autres articles devraient suivre rapidement.

Benchmark : les performances finales

Pour évaluer ces optimisations, j’ai naturellement fait une série de tests. J’aurais pu terminer par cette partie, mais je trouve ça plus sympa de la mettre au tout début. Au moins, ça montre où on va. Voici donc comment j’ai réalisé ces tests de performance :

  • J’ai installé une distribution Debian 5 vierge, avec Apache, PHP5 et MySQL (configuration de base) ainsi que la dernière version de Wordpress 2.9.2. J’ai ajouté quelques articles bidons, et les 10 plugins les plus populaires de Wordpress.
  • Puis j’ai fait mes premiers tests. En moyenne, sur ma machine virtuelle, en simulant 1000 utilisateurs en ligne simultanément, qui appellent aléatoirement la page d’accueil, l’accueil d’une catégorie, la page d’une recherche ou la page d’un article, la page se charge en 3622,1 millisecondes. Ca peut paraitre beaucoup, mais c’était une machine virtuelle, et il y avait quand même 1000 personnes en parallèle.
  • J’ai fait mes optimisations sur Wordpress, configuré un Squid en profondeur, configuré correctement MySQL et Apache.
  • J’ai relancé mes tests. Toujours sur ma machine virtuelle, et toujours en simulant toujours 1000 utilisateurs en ligne simultanés, qui appellent aléatoirement la page d’accueil, l’accueil d’une catégorie, la page d’une recherche ou la page d’un article, la page se charge en moyenne en 129,4 millisecondes.

Soit un chargement moyen 27 fois plus rapide !

Attention aux plugins, attention aux thèmes

Même si cela ne rentre pas directement en compte dans mes tests, c'est le premier conseil que je peux vous donner : il faut faire attention à certains plugins. Certains d’entre eux sont très mal codés, et consomment beaucoup de ressources.

C’est dommage, car un tout petit plugin peut parfois écrouler les performances globales de votre blog. Si vous n’avez pas le niveau pour analyser la source de ces plugins, essayez quand même de regarder les appréciations globales sur Wordpress Plugins, dans les commentaires.

C’est aussi valable pour les thèmes. C’est même encore plus traitre, car on ne s’attend pas à ce qu’un thème puisse être une « usine à gaz ». Pourtant, certains proposent tellement d’options qu’ils sont super lourds. Je pense par exemple au thème Mystique.

Pour les thèmes, pensez aussi à regarder la taille des images et des fichiers Javascript. Ces fichiers doivent en effet être chargés par vos lecteurs : s’ils sont lourds, le chargement des pages sera forcement plus longs. C’est désagréable pour les lecteurs.

Désactiver la révision des articles

Depuis la version 2.6, Wordpress inclut un système de « révisions ». En gros, lorsque vous modifiez ou enregistrez un article, un nouvel enregistrement est ajouté dans la base de données. C’est pratique lorsque vous écrivez à plusieurs et que vous souhaitez garder une trace de toutes les modifications réalisées (avec la possibilité de revenir en arrière), mais c’est très consommateur en ressources.

En effet, un article peut ainsi se retrouver en 15 ou 20 exemplaires dans votre base de données. La taille de votre base de données sera donc décuplée, ce qui l’alourdira. Du coup, en plus de consommer plus d’espace disque, elle sera légèrement plus lente.

Si vous n’avez pas besoin de cette fonctionnalité, autant la désactiver directement. Pour cela, modifiez le fichier wp-config qui se trouve à la racine de votre Wordpress, puis ajoutez la ligne suivante :

define('WP_POST_REVISIONS', false);

Vous pouvez également purger votre base de données, en effaçant l’ensemble des “revisions”. Rassurez-vous, cela n’aura aucun impact sur l’affichage de votre blog ; seuls l’historiques des modifications sera supprimés. Pour cela, connectez-vous à votre base de données MySQL (via phpMyAdmin, par exemple), et lancez la requête SQL suivante :

DELETE FROM wp_posts WHERE post_type = 'revision';

Ajouter un cache Gravatar

Wordpress intègre le service Gravatar, qui permet d’associé automatiquement un avatar selon l’adresse email de l’auteur d’un commentaire. C’est notamment ce service qui permet d’ajouter automatiquement ma petite photo, à coté de tous mes commentaires.

Cependant, les serveurs Gravatar ne sont pas toujours très véloces. Surtout qu'ils ne demandent pas au navigateur de les mettre en cache. Une image, une requête HTTP. Avec 50 commentaires, 50 requêtes HTTP supplémentaires. Ca peut vite devenir lent pour le visiteur !

Heureusement, un plugin vous permet de mettre en cache ces avatars. Vous avez ainsi le contrôle sur l’expiration du cache navigateur, et limitez les requêtes vers les serveurs Gravatar.

Héberger vos images sur des IPs différentes

Quand un navigateur charge une page, il charge également l’ensemble de ses images, et l’ensemble de ses fichiers Javascript. Pour cela, il fait une requête HTTP par objet. Seulement, pour ne pas surcharger le pauvre serveur, il se limite généralement à 2 ou 3 requêtes simultanées sur la même IP… ce qui prend au final encore plus de temps !

Pour contourner cela, une idée est d’avoir plusieurs IP. Si vous avez un serveur dédié, vous pouvez facilement créer un sous-domaine, pointant sur votre serveur avec une autre IP, pour héberger toutes vos images. Si vous êtes en mutualisé, c’est déjà plus dur. La solution est alors d’avoir plusieurs hébergeurs, avec des IP différentes.

Et ensuite ?

La suite sera détaillée dans les prochains billets. Par contre, pour la suite, il sera nécessaire d’avoir la main sur la configuration du serveur. Au programme : mise en place d’un cache léger en mémoire vive, configuration d’Apache et MySQL, mise en place d’un cache lourd (via l’installation et la configuration d’un proxy).

En espérant que ce premier article puisse vous servir, même s'il concerne pour le moment que les bases de l'optimisation. J'attends vos conseils et remarques, pour rédiger au mieux la suite de cet article.

Vos réflexions

Merci à toi Aurelie pour cet article, en attendant la suite avec impatience. Mais j'ai cru attendre que sa rédaction est déjà bien entamée :)
Bordel, une fausse manipulation, et mon long commentaire est en l'air...

Je reprends, en faisant plus court :

Ton article est complètement réussi : tu m'as fait un lien :)

Plus sérieusement, je retiens le coup de désactiver la révision des articles. Le top serait que les sauvegardes soient supprimées automatiquement après la publication et quelques jours.

Bravo pour l'article !

<i>Au passage, pas cool que des updates Twitter soient protégées, du coup, impossible de savoir ce que tu racontes de beau pour éventuellement t'ajouter</i>
@Julien :

Oui, la suite est déjà bien avancée. J'espère tout finir ce week-end. Merci à toi pour avoir publié mon article.

@Keeg :

Merci. Il serait en effet possible de faire un plugin pour purger la base serait en effet possible. Il faudrait que j'y réfléchisse.

Pour Twitter, j'avais déjà quelques aprioris avant de m'inscrire, donc je préfère garder la main sur les personnes qui peuvent me lire.&nbsp;Du moins, pour l'instant.
En effet, bel article, assez bien expliqué. J'attends la suite avec impatience !
Ajouter un cache au niveau de Wordpress n'est pas aussi une bonne idée ? Car les articles bougent assez peu sur un blog en général.
Excellent article! J'attends le second avec impascience!
Moi qui avait des soucis avec ma BDD, c'est regle :-)
@Louna : Si, ajouter un cache est une bonne idée. Mais visiblement, cela se abordé dans la suite de l'article :

"Au programme : mise en place d’un cache léger en mémoire vive"
Mouais. Autant le fond de l'article est intéressant, autant j'aurais préféré qu'il soit écrit par Julien Guyomard. Aurelie, je ne dis pas ça pour être méchant, mais bon, il faut reconnaitre ce qu'il doit l'être, tu es loin d'avoir son style d'écriture...

Je ne suis pas contre le Guest Blogging, mais j'aime autant quand il est fait par de vrais blogueurs. Pas des développeuses qui s'improvisent blogueuse une journée... Là, on sent directement le coté "débutant" de l'article (au niveau de sa rédaction), et c'est dommage car tu as l'air plutôt calé dans ton domaine !

Mais bon, maintenant que tu as commencé, autant finir cette série... Je dis juste que j'aurais préféré avoir le même contenu, mais écrit par Julien Guyomard, avec son style d'écriture.
@Jem' :

Je te trouve un peu dur. Ok, ce n'est pas ma plume, ok, ce ne sont pas mes expressions. Et alors&nbsp;?

D'autant plus qu'il s'agit d'un article technique. Il s'adresse à une population relativement <em>experte</em> dans ce domaine, et relativement à l'aise avec des documentations austères. Et oui, suffit de regarder les sources de Wordpress pour voir que ce n'est pas aussi poétique qu'ils le prétendent. Pas au sens de Victor Hugo, du moins. Du code, du code et encore du code. Avec allitération en IF, svp.

Et puis, comment une non-blogueuse pourrait un jour devenir une blogueuse si elle ne se jette pas à l'eau ? ;)
@Jem : Gloup. J'essaye de faire de mon mieux, je ne prétends pas être une experte en blogging. J'ai proposé cet article à Julien, il a accepté, voilà tout. Après, si tu as des conseils précis sur ce qu'il ne va pas dans l'article, je prends, je ne demande que ça (mais pas ici, envoie moi tout ça par DM sur Twitter par exemple)

@Louna : Oui, l'ajout d'un cache sera expliqué dans le prochain article. Ca sera peut être même le coeur du prochain article.
Aurelie : Je peux pas te dire précisément ce qui va pas, c'est juste l'ensemble qui n'est pas "comme d'habitude".
[...] Optimisons Wordpress – Partie 1 [...]
Très bon article :-) Un peu trop PRO quand même, mais bien détaillé, on attend la suite ...
Très bon article !

Je vais essayer de mettre en application tous ces conseils

Merci :)
[...] Optimisons Wordpress – Partie 1 [...]
[...] Ilonet: Optimisons Wordpress – Partie 1. [...]
J'allais oublié, comment ça se fait que ilonet n'a pas de Favicon ???
@LeBlogger : Normalement, il y en a un. Il a dû se perdre dans la migration, je vais voir avec Aurelie pour le remettre en place.
Ok, stp demande lui d'intégré un bouton RT, genre Tweetmeme ou Topsy, ça nous facilitera la vie :-)
Merci beaucoup pour cet article qui est justement plus technique que ce que l'on a l'habitude de voir pour optimiser wordpress ;)
Et plus particulièrement pour avoir dégoté le plugin GravatarLocalCache qui permet enfin de cacher les gravatar, et propose une alternative au plugin Gravatars2 qui est abandonné depuis bien longtemps !
Vivement la suite.
@LeBlogger : Pour le bouton RT, je vais essayer de regarder ça quand j'aurais deux minutes. Ou voir avec Aurelie si elle peut me le faire rapidement.

@Reaves : La suite arrive dans quelques jours, et devrait être encore plus technique ;)
[...] Optimisons Wordpress - Partie 1 [...]
Sur mon blog,
Installer le thème Mystique: done !
Installer plein de plugins inutiles: done !
Activer la révision des articles: done !
YOUHOU ! Oh wait...

Bon je vais de ce pas me remettre le nez dans la config de mon blog qui est le parfait exemple de ce qu'il ne faut pas faire...

Merci pour ce superbe article !
[...] Ilonet : Wordpress est un chouette moteur de blog mais il peut parfois se transformer en une véritable usine à gaz. Et justement, si vous avez envie de le soulager un peu, alors ces différents conseils pour l'optimiser pourraient vous sauver la mise. [...]
Pas mal pour un article qui a été rédigée en guest blogging, très bien même! Je suis d'accord avec les autres, de très bon conseils, reste juste à les appliquer...