Introduction
Redis est une base de données clé-valeur open-source développé par Salvatore Sanfilippo qui est sponsorisé par VMWare. Il est utilisé par des sites tels que Twitter, GitHub, Pinterest, Snapchat, Craigslist, Digg, StackOverflow et Flickr. Redis permet de garder en mémoire les requêtes mySQL. C'est un système de mise en cache extrêmement simple à mettre en oeuvre et qui peut apporter d'importants gains de performance. Bien que tous les sites soient différents et ne réagiront pas de la même façon, il n'est ainsi pas rare de voir le temps de chargement d'une page divisé par deux grâce à l'utilisation de Redis.
Memcached est un équivalent de Redis. Si vous vous demandez lequel utiliser, il vaut mieux opter pour Redis. Pour plus d'infos, voir cette réponse extrêmement détaillée sur StackOverflow.
Comment ça marche ?
A chaque fois qu'une page est chargée sur votre site lors d'une visite, une requête vers la base de données MySQL est effectuée. Redis retient ces requêtes, on dit qu'il les met en cache. Par la suite, si un autre visiteur charge la même page, la requête vers la base de données étant la même, le résultat de la requête est donné par Redis directement depuis la mémoire sans interroger la base de données. Le temps de chargement s'en trouve considérablement réduit et les ressources du serveurs sont moins solicitées. Si une valeur est mise à jour dans la base de données (un nouvel article est crée par exemple), la valeur pour cette requête est invalidée puis mise à jour.
Avant d'installer Redis, il est recommandé de backuper Wordrpess ou d'essayer d'abord sur un serveur de test.
Installer Redis
Rien de plus simple, sur Ubuntu :
sudo apt-get install redis-server php5-redis
Si le paquet et introuvable comme indiqué par ces lignes :
E: Unable to locate package redis-server
E: Unable to locate package php5-redis
Il faut updater comme suis : apt-get update
Si ça ne fonctionne toujours pas, il faut ajouter le repository universe :sudo add-apt-repository univers
Configurer Redis
Redis peut être utilisé comme cache mais aussi en tant que base de données NoSQL. Ici nous souhaitons l'utiliser en tant que cache et allons donc procéder à une modification de sa configuration.
sudo nano /etc/redis/redis.conf
On ajoute ces deux lignes à la fin du fichier
maxmemory 256mb
maxmemory-policy allkeys-lru
On peut ensuite vérifier que Redis fonctione en tappan redis-cli
puis ping
qui doit normalement répondre pong
user@vps123456:~$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
Puis taper exit pour quitter redis-cli
Editer wp-config.php
Il faut ensuite ajouter une ligne dans le fichier wp-config.php
qui se trouve à la racine du site WordPress. Dans /var/www/monsite_ par exemple
.
nano /var/www/monsite/wp-config.php
Après define('NONCE_SALT', 'xxxxxxxxxxxx')
on ajoute cette ligne define('WP_CACHE_KEY_SALT', 'monsite.com')
Il est possible de remplacer monsite.com
par n'importe quel texte mais mettre l'URL du site est une pratique courante. L'important étant d'avoir une CACHE_KEY
différente pour chaque site, au cas ou vous auriez plusieurs WordPress sur le même serveur.
Il faut également ajouter cette ligne define('WP_CACHE', true)
si elle n'est pas déjà présente dans wp-config.php
, ce qui est fort probable si un plugin de cache est déjà installé. Il l'aura alors lui-même écrite dans wp-config.php
.
On va ensuite relancer Redis et Apache :
sudo service redis-server restart
sudo service apache2 restart
Installer le plugin Redis pour WordPress
Il faut ensuite installer un plugin qui va permettre à WordPress d'utiliser Redis. Pas la peine de passer trop de temps à chercher, le choix se porte sur le plus populaire, il y'en à d'autres mais celui fonctionne très bien -> Redis Object Cache.
Après l'installation il n'y a plus qu'à activer le plugin puis se rendre dans ses réglages et cliquer sur "Enable Object Cache". Voici à quoi ressemble l'écran de configuration du plugin après l'activation du Object Cache :
Vérifier que l'installation fonctionne
Pour être sur que les requêtes sont bien mises en cache, on va utiliser cette commande redis-cli monitor
et charger une page du site ne la visitant depuis un navigateur. Redis-cli devrait afficher quelque chose comme ça :
user@vps123456:~$ redis-cli monitor
OK
1540926527.065181 \[0 127.0.0.1:33320\] "PING"
1540926527.068352 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:default:is\_blog\_installed"
1540926527.163400 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:options:notoptions"
1540926527.163749 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:options:alloptions"
1540926527.164753 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:site-options:1:notoptions"
1540926527.340377 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:userlogins:user"
1540926527.340603 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:users:20"
1540926527.340821 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:user\_meta:20"
1540926527.397905 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:default:yoast\_titles\_rich\_defaults\_wpseo\_titles"
1540926527.405984 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:site-options:1:notoptions"
1540926527.439025 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:posts:last\_changed"
1540926527.439300 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:posts:get\_pages:90fc8ab476d94daabffe7578772c763c:0.81130900 1540903129"
1540926527.441645 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:posts:get\_pages:77573666ef24e1ad91fd9fbfd44c872f:0.81130900 1540903129"
1540926527.446576 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:posts:get\_pages:f7220df17210d0587c39e777e2eba779:0.81130900 1540903129"
1540926527.447567 \[0 127.0.0.1:33320\] "GET" "monsite.com/fr/azbbo2r\_:posts:get\_pages:02b8038114158e6e8039262ece2f0908:0.81130900 1540903129"
1540926527.480608 \[0 127.0.0.1:33320\] "DEL" "monsite.com/fr/azbbo2r\_:default:yoast\_titles\_rich\_defaults\_wpseo\_titles"
1540926527.574190 \[0 127.0.0.1:33320\] "SET" "monsite.com/fr/azbbo2r\_:default:yoast\_titles\_rich\_defaults\_wpseo\_titles" "a:41:{s:10:\\"title-post\\";s:39:\\"%%title%% %%page%% %%sep%% %%sitename%%\\";s:13:\\"metadesc-post\\";s:0:\\"\\";s:12:\\"noindex-post\\";b:0;s:13:\\"showdate-post\\";b:0;s:23:\\"display-metabox-pt-post\\";b:1;s:23:\\"post\_types-post-maintax\\";i:0;s:10:\\"title-page\\";s:39:\\"%%title%% %%page%% %%sep%% %%sitename%%\\";s:13:\\"metadesc-page\\";s:0:\\"\\";s:12:\\"noindex-page\\";b:0;s:13:\\"showdate-page\\";b:0;s:23:\\"display-metabox-pt-page\\";b:1;s:23:\\"post\_types-page-maintax\\";i:0;s:16:\\"title-attachment\\";s:39:\\"%%title%% %%page%% %%sep%% %%sitename%%\\";s:19:\\"metadesc-attachment\\";s:0:\\"\\";s:18:\\"noindex-attachment\\";b:0;s:19:\\"showdate-attachment\\";b:0;s:29:\\"display-metabox-pt-attachment\\";b:1;s:29:\\"post\_types-attachment-maintax\\";i:0;s:13:\\"title-product\\";s:39:\\"%%title%% %%page%% %%sep%% %%sitename%%\\";s:16:\\"metadesc-product\\";s:0:\\"\\";s:15:\\"noindex-product\\";b:0;s:16:\\"showdate-product\\";b:0;s:26:\\"display-metabox-pt-product\\";b:1;s:26:\\"post\_types-product-maintax\\";i:0;s:18:\\"title-tax-category\\";s:53:\\"%%term\_title%% Archives %%page%% %%sep%% %%sitename%%\\";s:21:\\"metadesc-tax-category\\";s:0:\\"\\";s:28:\\"display-metabox-tax-category\\";b:1;s:20:\\"noindex-tax-category\\";b:0;s:18:\\"title-tax-post\_tag\\";s:53:\\"%%term\_title%% Archives %%page%% %%sep%% %%sitename%%\\";s:21:\\"metadesc-tax-post\_tag\\";s:0:\\"\\";s:28:\\"display-metabox-tax-post\_tag\\";b:1;s:20:\\"noindex-tax-post\_tag\\";b:0;s:21:\\"title-tax-post\_format\\";s:53:\\"%%term\_title%% Archives %%page%% %%sep%% %%sitename%%\\";s:24:\\"metadesc-tax-post\_format\\";s:0:\\"\\";s:31:\\"display-metabox-tax-post\_format\\";b:1;s:23:\\"noindex-tax-post\_format\\";b:1;s:22:\\"title-tax-product\_type\\";s:53:\\"%%term\_title%% Archives %%page%% %%sep%% %%sitename%%\\";s:25:\\"metadesc-tax-product\_type\\";s:0:\\"\\";s:32:\\"display-metabox-tax-product\_type\\";b:1;s:24:\\"noindex-tax-product\_type\\";b:0;s:30:\\"taxonomy-product\_type-ptparent\\";i:0;}"
Conclusion
C'est tout ! Redis est installé et configuré. Il ne reste plus qu'à faire un test de temps de chargement à l'aide de Lighthouse, GTmetrix, Pingdom, webpagetest.org ou votre outil de mesure préféré pour observer le gain sur le temps de chargement du site.
Et si besoin de vider le cache de Redis, la commande est redis-cli flushall