Menu Fermer

Comment vider le cache Nginx

Nginx propose des fonctionnalités de cache avancé pour des performances maximales.

Mais l’un des effets secondaires de la mise en cache de contenu est que les mises à jour de contenu sur le serveur d’origine ne se propagent pas nécessairement immédiatement au cache, ce qui signifie que les clients pourraient continuer à être servi l’ancien contenu pendant une période de temps.
Si une opération de mise à jour modifie un certain nombre de ressources en même temps), il est possible qu’un client soit servi un mélange de ressources périmées et actuelles, ce qui conduit à une présentation incohérente.

Nginx offre plusieurs façons de purger le cache.
Dans ce tutoriel, je vous explique comment vider le cache Nginx.

Comment vider le cache Nginx

Comment vider le cache Nginx en totalité

Pour la configurer la mise en cache de Nginx, suivez ce guide :

Le chemin du cache se trouve dans la directive fastcgi_cache_path ou proxy_cache_path.
Il suffit d’utiliser la commande rm pour supprimer l’intégralité du cache nginx.
Par exemple :

rm -rf /var/cache/nginx/*
/etc/init.d/nginx reload

Relancez la configuration de nginx est nécessaire afin qu’il recréé les répertoires de cache.
Si vous ne le faites pas, le cache ne sera pas utilisé.

Comme le montre cette capture, le cache passe en MISS après avoir purgé le cache et le reste tant qu’on ne relance pas nginx.

Comment vider le cache Nginx en totalité

Comment vider le cache Nginx d’une page WEB spécifique

Par la méthode Bypass

La directive proxy_cache_bypass ou fastcgi_cache_bypass est utilisée pour invalider le cache en demandant à Nginx de transmettre la demande au serveur backend et de rafraîchir la ressource mise en cache lors de la récupération à partir du serveur backend.
Ainsi, nous ne supprimons aucun élément mis en cache dans le cache, mais nous le rafraîchissons.

Voici un exemple d’utilisation avec une invalidation lorsque l’on interroge le serveur nginx depuis localhost.
Vous pouvez modifier le if pour ajouter un proxy ou un header spécifique.

if ($remote_addr ~ "^(127.0.0.1)$") {
    set $bypass $http_cache_purge;
}

Ensuite on met à jour le cache comme ceci :

fastcgi_cache_bypass $bypass;

Ce qui nous donne :

server {
	[...]

	set $bypass 0;
	if ($remote_addr ~ "^(127.0.0.1)$") {
    		set $bypass $http_cache_purge;
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
 		fastcgi_cache php;
                fastcgi_cache_key "$scheme$request_method$host$request_uri";
		fastcgi_cache_valid 200 302 30d;
	        fastcgi_cache_valid 301 5d;
            	fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
		fastcgi_cache_min_uses 2;
        	fastcgi_cache_bypass $bypass;
		add_header Cache $upstream_cache_status;
		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	}

On calcule le MD5 d’une page prise dans le cache Nginx à l’aide de CURL :

curl -s http://localhost/demo.php|md5sum
fe01ce2a7fbac8fafaed7c982a04e229  -

Puis on modifie le contenu de la page et Nginx continue de retourner le cache, ainsi, la modification n’est pas prise en compte.

curl -s http://localhost/demo.php|md5sum
fe01ce2a7fbac8fafaed7c982a04e229  -

On demande à mettre à jour le cache, qui est cette fois-ci est effective, le MD5 change.

curl -s -H 'Cache-Purge: true' http://localhost/demo.php|md5sum
107a170f84c3cd62af57a97c9bd0b531  -
Comment vider le cache Nginx d'une page WEB spécifique

Par la méthode proxy_cache_purge

La directive proxy_cache_purge ou fastcgi_cache_purge permet de supprimer l’entrée de cache avec une clé de cache correspondante. Le résultat d’un fonctionnement réussi est indiqué en renvoyant la réponse 204 (pas de contenu).

Tout d’abord, sur Debian et Ubuntu, il est nécessaire d’installer le paquet nginx-extras, sinon vous obtiendrez l’erreur suivante :

nginx: [emerg] unknown directive "proxy_cache_purge"

En effet, la directive proxy_cache_purge nécessite le module ngx_http_proxy_module.

proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;

map $request_method $purge_method {
    PURGE   1;
    default 0;
}

server {
    [...]

location ~ \.php$ {
		include snippets/fastcgi-php.conf;
 		fastcgi_cache php;
                fastcgi_cache_key "$scheme$request_method$host$request_uri";
		fastcgi_cache_valid 200 302 30d;
	        fastcgi_cache_valid 301 5d;
            	fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
		fastcgi_cache_min_uses 2;
		fastcgi_cache_purge $purge_method;
		add_header Cache $upstream_cache_status;
		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	}

}

On voit bien que le purge du cache est pris en compte :

curl http://localhost/demo.php
demo
vim demo.php
curl http://localhost/demo.php
demo
curl -X PURGE "http://localhost/demo.php"
demo-111
Comment vider le cache Nginx d'une page WEB spécifique

Si la clé de cache d’une demande de purge se termine par un astérisque («*»), toutes les entrées de cache correspondant à la touche générique seront supprimées du cache. Cependant, ces entrées resteront sur le disque jusqu’à ce qu’elles soient supprimées pour inactivité ou traitées par le cache Purger, ou un client tente d’y accéder.

curl -X PURGE "http://localhost/demo.php"

Manuellement par la commande rm

Vous pouvez aussi supprimer le fichier cache d’une page WEB spécifique, mais pour cela, il faut bien comprendre le fonctionnement du cache NGINX.

Le nom de fichier dans un cache est le résultat de l’application de la fonction MD5 à la directive key de mise en cache. Par exemple, prenons cette directive de clé de cache :

fastcgi_cache_key "$scheme$request_method$host$request_uri";

Ce qui nous donne une clé :

httpGETlocalhost/demo.php

Le nom du fichier dans le cache sera :

echo -n "httpGETlocalhost/demo.php"|md5sum
c9a68ec5651224435f3dc01d055550a0  -

En utilisant la commande find, on trouve bien notre fichier de cache pour la page demo.php :

find /var/cache/nginx -name "c9a68ec5651224435f3dc01d055550a0" -print
/var/cache/nginx/php/0/0a/c9a68ec5651224435f3dc01d055550a0
Comment vider le cache Nginx d'une page WEB spécifique

A partir de là, on peut vider le cache Nginx de la page suivante :

rm -f /var/cache/nginx/php/0/0a/c9a68ec5651224435f3dc01d055550a0

Script pour purger le cache Nginx

Enfin, on peut créer un script shell pour purger le cache d’une ressources :

CACHE_PATH=/var/cache/nginx
MD5=$(echo -n $1|md5sum|cut -d ' ' -f 1)
f1=$(printf $MD5 | tail -c 1)
f2=$(printf $MD5 | tail -c 3|head -c 2)
rm $CACHE_PATH/$f1/$f2/$MD5

Par exemple nommez le script vider-cache.sh puis appelez la ressource en argument :

./vider-cache.sh /masuperpage.php

avec Nginx helper pour WordPress

Nginx helper est une extension pour WordPress qui vous permet de vider le cache Nginx d’une page spécifique.
De plus lorsque vous modifiez un article, l’extension met à jour le cache automatiquement.
Cela est donc pratique pour livrer un contenu à jour.

Comment vider le cache Nginx avec Nginx helper pour WordPress