Skip to main content

Le cache fastcgi et Nginx - Partie 3

·317 words·2 mins

Le cache fastcgi et Nginx - Partie 3
#

Passage à nginx 1.1.0
#

Le passage à une version récente de nginx apporte le paramètre fastcgi_cache_bypass qui va me permettre d’avoir une installation rapide et pérenne.

MAIS il faut commencer par régler les régressions (ou les changement de principes).

Le cache ne fonctionne plus
#

Après moulte recherche j’ai trouvé une phrase anodine dans le changelog de nginx : en 0.8.44 :

Change: now nginx does not cache by default backend responses, if they have a “Set-Cookie” header line.

Pour régler le problème (c’est à dire forcer le cache même si tout semble indiquer que le cache serait une mauvaise solution), j’ai trouvé une solution sur ce post. Donc mon code ressemble à çà :

location ~ doku\.php$ {
               fastcgi_cache mycache;
               fastcgi_cache_key $request_method$host$request_uri;
               fastcgi_cache_valid 1h;
               fastcgi_ignore_headers Expires Cache-Control Set-Cookie;
               include /etc/nginx/fastcgi_params;
               fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               fastcgi_pass    unix:/tmp/fcgi.sock;
}

Le cache oui mais il faut me laisser bosser :P
#

Avec la configuration ci dessus le cache est actif pour tout le monde … même moi. Je ne peux donc plus me connecter pour ajouter/modifier des articles. Je vous laisse imaginer que ce n’est pas une solution viable.

Comme je suis le seul contributeur à ce blog, il faut juste que je trouve une solution pour que le cache ne s’applique pas à moi. La solution la plus simple que j’ai trouvé est de faire un contrôle sur cookie : Si le navigateur du visiteur a un certain cookie alors il ne passe pas par le cache. Bingo ça marche :

location ~ doku\.php$ {
               set $pasdecache "";
               if ($http_cookie ~ pasdecache) {
                        set $pasdecache "Y";
               }
               fastcgi_ignore_headers Expires Cache-Control Set-Cookie;
               fastcgi_cache mycache;
               fastcgi_cache_key $request_method$host$request_uri;
               fastcgi_cache_valid 1h;
               fastcgi_cache_bypass $pasdecache;
               fastcgi_no_cache $pasdecache;
               include /etc/nginx/fastcgi_params;
               fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               fastcgi_pass    unix:/tmp/fcgi.sock;
}

J’ai utilisé Firecookie pour me créer un cookie qui expire en 2013 et cela fonctionne suffisamment pour écrire cet article.