Guide des caches et déploiements sous Varnish

Sommaire :




Principe des caches - généralités

Les caches, notamment Varnish, sont très efficaces pour les performances, mais ajoutent une couche de complexité qu’il faut bien comprendre afin de pallier tout effet de bord.

En dehors de toute considération PrestaShop, il convient avant tout de comprendre comment fonctionne un cache :

  • lors d’un premier appel, le cache est constitué
  • lors des appels suivants, le code n’est plus exécuté et le cache est renvoyé
  • le cache doit se vider sur certain événements pour rester à jour

Il a pour but d'accélérer une réponse en évitant une exécution.

Il doit rester à jour soit par des vidages des caches intelligents soit par expiration de ses caches.




Différents types de caches

Dans le cas de PrestaShop, il existe différents types de caches, agissant sur :

  • des bouts de codes spécifiques (ex : hook de module)
  • des pages entières (technologies : varnish, page cache etc)

Et pouvant s'implémenter sous différentes formes :




Principe du cache varnish

  • il est paramétré sur un haproxy (brique logicielle devant le serveur php)
  • chez 7724 : influant sur accueil / catégories / produits / CMS / marques
  • met la page entière en cache
  • nécessite des exécutions dynamique pour certains blocs contextuels (ex : panier)
  • il peut gérer des clés de cache (ex : distinction des groupes clients)




Imbrication des caches

Les caches interviennent à différents niveaux. Il faut bien comprendre les imbrications de ceux-ci car vider un cache de niveau supérieur alors que celui de niveau inférieur n’est pas à jour ne sert à rien.
Dans sa version la plus complète, nous pouvons avoir cette pile d’imbrication :




Comment confirmer que l'on est sous varnish ?

Afin de confirmer si l’on est sur une réponse de varnish ou pas, il convient de regarder les header de réponse, du HTML par exemple :

Le header x-cache peut prendre deux valeurs :

HIT : le cache a répondu
MISS : le cache n’a pas été sollicité, la ressource est hors cache

Le header x-cache-hits montre le nombre de fois où le cache a été constitué.
Un vidage de cache d’une page (par le back office ou par un code PHP) fera revenir ce header à la valeur 0.
Si la valeur reste systématiquement à zéro, le cache ne se constitue pas.

Le header x-via donne l’information de quel haproxy a répondu (ex: ha1) au navigateur, ainsi que le serveur PHP qui lui a donné la réponse (ex : Frt01)




Voir les modifications malgré le cache

  • Varnish ne prend pas les paramètres en GET. En ajoutant ?nocache=1 à l’URL de la page nous sortons alors du cache varnish pour la page HTML, cela doit être confirmé dans les headers de réponse (x-cache = MISS)
  • En cas de déploiement, si cette simple manipulation suffit à afficher correctement la modification, alors seul le vidage de varnish est nécessaire, les autres s’étant visiblement déjà mis à jour




Module - Eo_clearcache

Ce module permet notamment de purger les différents niveaux de cache.

Il ajoute une interface visible dans le menu : Paramètres avancés > Performances




Quelles sont les bonnes pratiques d’une mise en production ?

En dehors de toute problématique de cache une mise en production doit être sécurisée par des bonnes pratiques :

  • s’assurer que votre système de versionning contient bien la version actuelle et nouvelle version des codes
  • être capable de fournir le différentiel de la livraison
  • être capable de revenir rapidement en l’état d’avant le déploiement




Comment visualiser une modification de contenus ou configuration qui ne serait pas visible en front office ?


Le bouton “impacter le front office” permet un vidage des caches liés aux affichages de contenus (càd sans modification de fichier) dans le bon ordre, cependant il remet tout à plat SAUF les caches de compilation smarty.

Si votre site n’est pas suffisamment optimisé ou subit un gros trafic, il pourra alors subir un ralentissement, évitez les purges de caches en pleine charge de traffic.




Comment déployer une modification de template / CSS / JS ? ou la modification d’une configuration ?

Pour ce type de déploiement, PrestaShop si il est configuré ainsi :

alors il détectera tout seul les modifications et les appliquera.

Restera alors à purger le cache varnish.

 

Si vous n'avez pas cette configuration précise de compilation des templates, vous pouvez utiliser le bouton “vider tous les caches” qui effectuera une remise à plat globale, ce qui est donc plus gourmand en termes de ressources.

Est-il possible de vider varnish sur une seule URL ?

Oui tout à fait. Dans le cas où une modification intervient uniquement sur une page, il est d’ailleurs préférable de vider uniquement celle-ci (afin de ne pas remettre à zéro tout le cache).

Pour ce faire, vous devez accéder à : paramètre avancés > performances
Puis cliquer sur le bouton pour accéder à la configuration avancée :

Ce bloc :

vous permet de vider le cache de l’accueil ou saisir une URL et de vider le cache de celle-ci.

ATTENTION : si vous avez plusieurs langues, n’oubliez pas de vider l’URL pour chacune des langue.


 

Que faire en cas de souci ?

Si ce n'est pas critique : contactez nous.

Si vraiment vous devez désactiver varnish à cause d’un effet indésirable critique

Dans un tel cas, ne désactiver pas le module eo_clearcache car :

  • le cache côté serveur continuerai d’être actif, mais avec un aspect logiciel dégradé
  • le module eo_clearcache comporte plusieurs overrides, sous certaines version, Prestashop tentera de les désinstaller ce qui pourrait causer des instabilités

Pour désactiver varnish

  • aller dans : Paramètres avancés > Performances
  • dans le bandeau ajouté par eo_clearcache, cliquez sur “accéder à la configuration”
  • passer l’activation de varnish à la valeur faux :

  • puis re ajoutez la restriction des modules dynamiques en passant cette configuration à la valeur vrai :

  • finalement effectuez un vidage de cache varnish pour remettre à plat les caches serveurs :

Votre site tournera alors sans varnish, le module eo_clearcache envoyant au serveur une instruction de ne pas appliquer le cache varnish.