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.


Published 11th Oct 2011 // #dokuwiki #nginx




comments powered by Disqus