Optimiser Wordpress : présentation préparée pour le Wordpressday Algérie en décembre 2011 par Jean-François VIAL
La video du screencast : http://vimeo.com/33115346
Licence : CC-By-SA
2. Un mot sur l'auteur :
Jean-François VIAL (Jeff)
Montpellier, France
Jeff Indépendant @ Modulaweb
Spécialiste WordPress, Zimbra et logiciels libres
Développeur PHP, Python, JS essentiellement
Contact sur http://about.me/Jeff_
QRCode
3. Pourquoi ?
Il y a plein de bonnes raions :
Confort de visite
Baisser la charge du serveur
À cause de notre ami Google !
Permettre d'encaisser des hausses de traffic
Parce que c'est bien :)
4. Comment ça marche ?
Avec une plateforme LAMP (Linux, Apache2, PHP5) ;
Étapes clés 1/2 :
1. Démarrage d'Apache
1.Lecture des fichiers de conf
2.Lecture des fichiers Vhost
2. Requête sur une page d'un WordPress
1.Recherche du fichier .htaccess et prise en compte
2.Génération de la page
1.Lecture et compilation par PHP
=> Création d'un opcode
2.Exécution de l'opcode par Apache
3.Calcul de l'Etag
4.Envoi de la page au client + cookies
5. Comment ça marche ?
Avec une plateforme LAMP (Linux, Apache2, PHP5) ;
Étapes clés 2/2 :
3. Requête sur les dépendances de la page (css,images,js…)
Pour chaque fichier :
1. Recherche du fichier .htaccess et prise en compte
2. Stockage des cookies
3. Lecture du fichier sur le disque
4. Récupération de la date de modification du fichier sur
le disque
5. Calcul de l'Etag
6. Envoi du fichier + cookies au client
6. Ce n'est pas tout !
Tous les fichiers ne se téléchargent pas en même temps !
(par défaut 4 à la fois sur un même domaine)
Attention à la favicon, si non présente, peut faire générer
plusieurs pages 404 à WP !
Idem fichier robot.txt et autres fichiers courrants
7. Sur quoi agir ?
Sur les accès au disque : il faut les limiter au strict
nécessaire
Sur le temps de génération des contenus dynamiques
(cache d'opcode)
Sur le nombre de contenus dynamiques générés
(cache HTML etc)
Sur le téléchargement des dépendances (cache client)
Sur le nombre de dépendances (grouper les js et css)
Sur la taille des document servis (compression gzip)
Sur la taille des requêtes (pas de cookies pour les
contenus statiques, js, css, images…)
8. Limiter les accès au disque
Copier le contenu du .htaccess dans le Vhost
Supprimer l'utilisation du .htaccess via la directive
AllowOverride None
dans le VHost
Supprimer la génération de l'Etag :
• Installer le mod_headers d'Apache
• Dans /etc/apache2/conf.d/headers, écrire les deux
directives suivantes :
Header unset ETag
FileETag None
(cf http://www.askapache.com/htaccess/apache-speed-
etags.html)
9. Accélérer PHP !
Installer un système de mise en cache d'opcode (mon
choix : XCache)
Sur Debian ou Ubuntu : sudo apt-get install php5-xcache
puis configurer /etc/php5/conf.d/xcache.ini en fonction de
votre système (fichier documenté)
puis redémarrer Apache (/etc/init.d/apache2 restart)
XCache, seul ne sert à rien, il faudra aussi installer le
plugin correspondant pour WP en allant ici :
http://neosmart.net/WP/XCache/
10. Limiter la génération des pages
Plugin WP Super Cache !
Page générée par WP servie en 0.8 s
Page en cache (fichier statique servi par Apache) <0.1 s
Si suffisamment de RAM, combiner avec mod_memcache
et/ou memcached
11. Contrôler le cache client
On peut indiquer au client la durée de vie de son cache
Les fichiers statiques changent peu souvent, inutile de les
recharger à chaque page lors d'une visite (js, css,
images…)
Activation du mod_expires (a2enmod)
Configuration du module via son fichier de conf ou Vhost
Selon le type/mime
Ex : ExpiresByType image/png "access plus 2 month"
Ex : ExpiresByType text/xml "modification plus 2 days"
12. Grouper !
Grouper les js et css = 2 fichiers seulement
Utilisation de PHPSpeedy
Désactiver l'option gzip si utilisation de mod_deflate
(double compression!)
Faire des tests avant la production
Penser aussi aux sprites dans vos thèmes !
13. Documents compressés
Les navigateurs modernes acceptent les contenus
compressés gzip/deflate
Apache possède un mod_deflate !
Taille des fichiers diminuée de 5 à 70% !
Déconseillé si peu de CPU/RAM (remède pire que le mal)
Permet de limiter la bande passante, accélérer le
téléchargment
Attention, certain plugins compressent les fichier (comme
PHPSpeedy) désactiver l'option
14. Votre propre CDN
Si le WP est sur mondomaine.com, faire pointer le sous
domaine cdn.mondomaine.com sur le WP
Configurer SuperCache pour gérer ce CDN
Autre domaine = pas de partage de cookies !
Permet de paralléliser les téléchargements
Multiplier les CDN si besoin
Possibilité de répliquer les données sur autre serveur
HTTP (comme lighttpd) et/ou autre machine !
15. Et Apache ?
Apache peut être configuré très précisément
! Cas par cas, selon la consommation CPU/RAM
Peser le pour et le contre, ajuster petit à petit
Aucune recette miracle
16. Et MySQL?
On peut configurer le cache de requêtes
Peu utile si le reste est fait car moins de requêtes
Nécessite un audit fin
17. Et PHP ?
Il faut désactiver ce qui est inutile / inutilisé
Ne pas loguer les erreurs en prod
Désactiver les directives register_* et magic_quote_*
Éventuellement régler les ressources dispos pour PHP
18. Et WordPress ?
En lui même WP fait déjà le max !
On peut éventuellement désactiver les révisions pour ne
pas surcharger la base via
define('WP_POST_REVISIONS', false);
Attention aux plugins ! Au plus il y en a, au plus c'est lent
Certains plugins sont très pénalisant : auditer à l'activation/
avant la prod !
19. Hébergement mutualisé
Pas d'optimisation coté serveur
Optimisation coté WP uniquement (via les plugins)
Optimisation des contenus et thème
21. Autres configs
Lighttpd + XCode
Nginx
Varnish en frontal
Couple Apache + mod_php + lighttpd pour le statique
22. Conseils
Testez, testez, testez… mais ne vous prenez pas la tête
Pas de miracles !
Découpez les articles longs
Pensez à Ajax et au lazy-loading
Un seul framework JS à la fois
Peu de plugins, mais des plugins utiles / efficaces
Petit serveur === petites perfs (pas de miracles!!!)
Gros serveur !== bonnes perfs
Petit serveur + bonne config == perfs correctes
23. Des questions ?
C'est à vous de parler !
Pas pu poser votre question ? On peut continuer sur ne
web ! http://about.me/Jeff_
MERCI !!!