Accueil du site > Varnish > Interfacer Varnish & SPIP

Interfacer Varnish & SPIP

mardi 29 mars 2011, par Fil

Principe de communication

Les communications entre notre application (ici il s’agira surtout de SPIP, mais le principe vaut pour d’autres applications) et notre proxy inverse Varnish se font par l’entremise des entêtes HTTP émises par l’application.

Nous introduisons les header() suivants :

- X-Varnish-TTL: 120
Cet entête indique que la page doit avoir un TTL, dans Varnish, de 120 secondes ; dans SPIP il sera émis dans les conditions suivantes :

  1. implicitement, en prenant la durée de cache de la page : TTL = min(durée du cache, 600)
  2. ou bien explicitement via la balise #HTTP_HEADER{X-Varnish-TTL: 120}

L’appel #HTTP_HEADER{X-Varnish-TTL: 0} permet de dire à Varnish de ne pas conserver la page produite (par exemple parce qu’elle contient du code en PHP qu’on veut faire tourner à chaque hit).

- X-Varnish-Purge: *
Cet entête indique à Varnish tout purger ; il est émis par la fonction suivre_invalideur(), à chaque modification des données. Il est également émis lorsqu’un changement de date provoque la publication d’un « article post-daté ».

De plus Varnish pourra aussi, indépendamment des entêtes envoyés par l’application, se baser sur l’URL pour invalider certaines pages.

Ainsi :

  1. l’URL …?var_mode=calcul est détectée par Varnish (indépendamment des entêtes de SPIP décrites ci-dessus), et invalide la page concernée (et celle-ci seulement).
  2. l’URL …?var_mode=(recalcul|images) est détectée par Varnish et invalide tout le cache de Varnish (notamment, parce qu’un recalcul d’une page peut provoquer la modification d’un fichier de CSS ou javascript associé).
  3. l’URL de suppression du cache SPIP depuis l’espace privé (un clic sur le bouton dans ?exec=vider_cache) invalide aussi tout le cache Varnish.

Implémentation

Cette approche me semble au final plus simple que celle donnée par la doc de Varnish, qui passe par la définition d’une méthode HTTP non standard PURGE. Pour l’implémenter, j’ai construit un fichier de configuration pour Varnish, ainsi qu’un plugin pour SPIP.

Remarque : les deux éléments (configuration et plugin) sont conçus pour fonctionner de concert, mais il est tout à fait possible d’utiliser la configuration pour Varnish sans installer le plugin SPIP. Les pages « dynamiques » produites par SPIP ne seront alors pas enregistrées dans le cache de Varnish, qui y stockera néanmoins tous les fichiers statiques (images, javascript, CSS etc.) selon des règles « assez bonnes ».

Autrement dit, sur un serveur hébergeant plusieurs sites, on peut installer Varnish sans installer le plugin sur tous les sites : seuls les sites SPIP ayant installé le plugin en tireront le maximum, mais les autres ne seront pas pénalisés.

Télécharger le plugin

La configuration de Varnish et le plugin SPIP sont téléchargeables depuis SPIP-Zone : http://zone.spip.org/trac/spip-zone/browser/_plugins_/varnish

Le plugin nécessite l’usage du plugin StatsJS, car, dès lors qu’on demande à Varnish de servir directement les pages SPIP, celui-ci ne peut plus comptabiliser les visites des pages de la façon habituelle.

Configuration de Varnish

Voici le fichier de configuration, commentaires inclus :

Comme on le voit c’est un gros fichier… on pourra en suivre le développement dans le répertoire du plugin.

 

Dans le prochain article j’indiquerai comment procéder pour terminer l’installation.

14 Messages de forum

  • Interfacer Varnish & SPIP Le 30 mars 2011 à 11:12 , par Beurt

    Merci encore pour ces billets, à la fois très didactiques et pratiques !

    Je suis hébergé dans un contexte où je ne contrôle pas la configuration de Varnish. Est-ce encore utile de manipuler les en-têtes des pages avec Spip (et le plugin que tu viens de mettre sur la zone) ?

    • Interfacer Varnish & SPIP Le 30 mars 2011 à 13:12 , par Fil

      Une configuration "par défaut" de Varnish respectera les entêtes de cache de SPIP, qui envoie toujours des pages « dynamiques » donc non cachables par le client. Or ce qu’on veut ici, c’est distinguer le cache client et le cache varnish.

      Si tu ne contrôles pas Varnish, tu peux imaginer envoyer une durée de cache > 0 sur les pages SPIP. Avec comme conséquence parfois un léger décalage entre ce que voit un utilisateur sans cookie par rapport à un utilisateur ayant un cookie. S’il s’agit de quelques secondes (10s ou 30s par exemple), ça peut être utile pour absorber des chocs violents.

      Mais ce n’est pas [en tous cas pas encore] l’objet de ce plugin, qui implémente un modèle de communication entre Varnish et l’application.

    • Interfacer Varnish & SPIP Le 30 mars 2011 à 17:34 , par Beurt

      OK, merci Fil.

      Donc ce n’est pas forcement très utile de « teeker » Spip si on est derrière un cache Varnish sur lequel on n’a pas la main...

      J’ai soumis ta série d’articles aux décideurs qui chapeautent la config du serveur qui m’héberge (ainsi que moult autres Spip), on va voir si tu les inspires ! :-)

    • Interfacer Varnish & SPIP Le 30 mars 2011 à 18:58 , par Fil

      Oui. Ce travail n’est pas exclusif à SPIP, il pourrait être adapté à d’autres logiciels sans grande difficulté. L’hébergeur a tout intérêt à regarder de près, car ça permet de servir beaucoup plus de clients avec moins de machines…

  • Interfacer Varnish & SPIP Le 31 mars 2011 à 10:59 , par aymeric

    Excellent article ! Je cherchait des infos sur Varnish (pour Wordpress) et le détail de cette config permet vraiment de mieux decrypter son fonctionnement.
    Merci :-)

  • Interfacer Varnish & SPIP Le 1er avril 2011 à 08:45 , par Cédric

    Super ! Deux ou trois petites questions :

    • les requêtes en POST sont elles automatiquement en mode by-pass ? je ne vois rien dans le fichier de configuration
    • est-ce que tu prévois quelque chose pour être en by-pass quand tu as un cookie admin ? Ou est-ce que tu passe quand meme via le cache varnish ?
    • comment gère tu l’accès à ecrire/ ? en by-pass ? via une url externe non varnishée ? avec une règle que je n’ai pas vue ?

    Sinon pour action=cron, je pense que cette règle devient parasite plus qu’autre chose à partir du moment où on utilise job_queue : le hit sur cette url n’est envoyé que lorsqu’il y a effectivement de travail à faire, et le filtrer risque plus de perturber la gestion de file qu’autre chose, notamment en cas de spool massif à traiter.

    • Interfacer Varnish & SPIP Le 1er avril 2011 à 09:03 , par Fil

      - La méthode POST et les cookies sont traités en PASS par défaut, ma config ne fait qu’éliminer les cookies "non significatifs", pour permettre de stocker les pages des visiteurs ayant par exemple un cookie de stats.

      - En ce qui concerne la règle pour action=cron, elle est précisément destinée à de vieux sites SPIP qui n’ont pas installé ni job_queue ni statsjs. En effet s’ils ont statsjs, il n’y a plus du tout de action=cron ; et s’ils ont job_queue l’URL n’est pas souvent présente et le cache de 5s ne s’applique donc que très rarement.

  • Interfacer Varnish & SPIP Le 7 avril 2011 à 23:29 , par deor

    Merci de partager ça.

    Pour ma part, j’ai choisi nginx (pour tout ce qui est statique) devant Apache (pour la partie dynamique), je ne connaissais pas Varnish. De ce que j’ai pu lire un peu, nginx offre de meilleurs performances en reverse-proxy (puisqu’il ne fait pas que ça). En plus, nginx est vraiment simple d’utilisation (ça ressemble beaucoup à Apache, niveau conf).

    Qu’est-ce qu’il y a d’intéressant dans Varnish par rapport à nginx ?

    • Interfacer Varnish & SPIP Le 8 avril 2011 à 09:04 , par Fil

      Comme tu dis, nginx est un serveur complet, qui peut remplacer totalement apache et servir directement les pages PHP. (Mais à ce compte-là, Apache aussi peut faire office de proxy.) L’avantage de Varnish c’est qu’il est optimisé pour jouer son rôle le plus rapidement possible et en évitant tout chargement inutile en mémoire (même la configuration est écrite en pseudo-C et est compilée avant exécution). Pour savoir ce que ça a comme conséquences pratiques en termes de micro-secondes gagnées, il faudrait monter un benchmark.

  • Interfacer Varnish & SPIP Le 22 janvier 2012 à 14:06 , par Dimitri

    Hello,

    i installed varnish on my server and the plugin inside spip. When i started varnish, i did it using the file /etc/varnish/default.vcl

    Are you sure that the .vcl included in the plugin is executed ? If i try to start varnish using your .vcl i get an error.

    I don’t understand if everithing is running well or if i have to do something more, just like insert something in the squellettes.

    I hope you will reply me, thanks for you work BTW.

    • Interfacer Varnish & SPIP Le 22 janvier 2012 à 14:29 , par Fil

      it works here !

      what is your error ? what version of varnish ?

    • Interfacer Varnish & SPIP Le 23 janvier 2012 à 10:13 , par Dimitri

      Varnish 3.0. It tells me that there is an error at line 143 (if i remember). So, you confirm me that i have to start varnish from ssh whit your vcl file and not whit the standard one. Right ?

    • Interfacer Varnish & SPIP Le 23 janvier 2012 à 10:21 , par Fil

      This config file is for Varnish 2. I have yet to modify it for Varnish 3, as they have changed the syntax (and they seem to plan to change it again for Varnish 4).

    • Interfacer Varnish & SPIP Le 23 janvier 2012 à 12:39 , par Dimitri

      Ok ! I hope to find the new configuration file soon ! Thanks in advantage for your support ;)