nginx
Cache FastCGI nginx : accélérer un site sans casser le panier
Une page WordPress servie depuis le cache de nginx ne réveille ni PHP ni la base de données : le temps de réponse passe de plusieurs centaines de millisecondes à quelques-unes. Le risque, c’est de servir à un visiteur la page mise en cache pour un autre : un panier, un compte, un nom affiché. Tout l’art est dans ce qu’on exclut.
# Contexte http (par exemple /etc/nginx/conf.d/cache.conf)
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=SITES:50m
max_size=1g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
L’en-tête X-Cache permet de vérifier : deux appels successifs avec curl -sI doivent afficher MISS puis HIT, et une page du panier toujours BYPASS. Les adresses exclues sont à adapter aux permaliens réels de la boutique. Cette technique convient bien à WordPress et WooCommerce ; sur PrestaShop, qui dépose un cookie de session dès la première visite, elle ne s’applique pas telle quelle.
# Bloc server du site
set $sans_cache 0;
if ($request_method = POST) { set $sans_cache 1; }
if ($query_string != "") { set $sans_cache 1; }
if ($http_cookie ~* "wordpress_logged_in|woocommerce_items_in_cart|wp_woocommerce_session|comment_author") {
set $sans_cache 1;
}
if ($request_uri ~* "^/(panier|commande|mon-compte|wp-admin|wp-login\.php)") {
set $sans_cache 1;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_cache SITES;
fastcgi_cache_valid 200 301 10m;
fastcgi_cache_bypass $sans_cache;
fastcgi_no_cache $sans_cache;
add_header X-Cache $upstream_cache_status;
}
Sources
- nginx, module ngx_http_fastcgi_module nginx.org