Jan 132013
 

Si vos sites ne sont pas parcourus régulièrement, les pages ne seront plus dans votre cache varnish, vous pourriez augmenter le ttl de vos pages mais si vous mettez à jour régulièrement vos sites cela peut être embêtant.
La solution, créer un cron qui parcours votre site avec ce script :

#!/bin/bash
 
Sitemap='www.exemple.com/sitemap.xml'
Site='www.exemple.com'
wget='/usr/bin/wget'
grep='/bin/grep'
awk='/usr/bin/awk'
find='/usr/bin/find'
mount='/bin/mount'
umount='/bin/umount'
sed='/bin/sed'
wc='/usr/bin/wc'
cut='/usr/bin/cut'
 
if [ `$mount -l | $grep /tmp/wget | $wc -l` -gt 0 ] ; then exit 1 ; fi
 
touch /tmp/cookies.txt
$wget -q -O /dev/null "URL pour régénérer le sitemap"
 
if [ ! -d /tmp/wget ] ; then
   mkdir /tmp/wget
fi
 
$mount -t tmpfs -o size=25M tmpfs /tmp/wget
cd /tmp/wget
 
for site in $Sitemap ; do
   for url in `$wget -q -O - "http://$site" | $grep '<loc>'  | $awk -F'<loc>' '{print $2}' | $awk -F'</loc>' '{print $1}'` ; do
      $wget -q -p --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt "$url"
      for index in `$find . -type f | $sed 's:^./::' | $grep index.html` ; do
            for href in `$grep href "$index" | $cut -d"'" -f2 | $cut -d'"' -f2 | $grep http | $grep "$Site"` ; do
                  $wget -q -p --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "$href"
                  $wget -q -p --header='Accept-Encoding: gzip, deflate' "$href"
            done
      done
      for file in `$find . -type f | $sed 's:^./::' | $grep -v index.html` ; do
          $wget -q -O /dev/null  --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "http://$file"
          $wget -q -O /dev/null  --header='Accept-Encoding: gzip, deflate' "http://$file"
      done
      for file in `$find . -type f | $sed 's:^./::' | $grep index.html | $sed 's:index.html::'` ; do
          $wget -q -O /dev/null  --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "http://$file"
          $wget -q -O /dev/null  --header='Accept-Encoding: gzip, deflate' "http://$file"
      done
      rm -rf /tmp/wget/*
   done
done
rm /tmp/cookies.txt
cd /tmp/ ; $umount /tmp/wget ; rm -rf /tmp/wget

Maj 13/01/12 : Ajout href

Déc 142012
 

Ajoutez dans le vcl_recv :

if (req.url ~ "/cdx10b.js\?rnd\=" || req.url ~ "/cdx10b-100KB.js\?rnd\=" ) {
        set req.url = regsuball(req.url, "cdx10b\.js\?rnd=[0-9a-zA-Z\-]+", "cdx10b.js");
        set req.url = regsuball(req.url, "cdx10b\-100KB\.js\?rnd=[0-9a-zA-Z\-]+", "cdx10b-100KB.js");
}

Ajoutez le « unset req.http.cookie; » si il n’est pas enlever dans une règle générique à tous les JS

Maj 14/12/12 : Regex

Avr 172012
 

– Vider tout le cache (script PHP) :

<?php
        exec('echo "ban.url /*" | nc -q 1 127.0.0.1 6082');
?>

– Vider le cache d’un vhost (script BASH) :

#!/bin/bash
 
if [ ! -z $1 ] ; then
        case "$1" in
                -h|--help) echo "Usage ./clear_cache.sh HOST"; echo "For example HOST : exemple.com" ; exit 1 ;;
                *) HOST=$1;;
        esac ;
else
        echo "Usage ./clear_cache.sh HOST"; echo "For example HOST : exemple.com" ; exit 1 ;
fi
echo "ban req.http.host ~ \"$HOST\"" | nc -q 1 127.0.0.1 6082 &> /dev/null
echo "$HOST cleared"

– Vider le cache d’une URI (script BASH) :

#!/bin/bash
url="/*"
if [ ! -z $1 ] ; then
        case "$1" in
                -h|--help) echo "Usage ./clear_cache.sh URL"; echo "For example URL : /accueil" ; echo "URL= /* if argument missing"; exit 1 ;;
                *) url=$1;;
        esac ;
fi
echo "ban.url $url" | nc -q 1 127.0.0.1 6082 &> /dev/null
echo "$url cleared"

– Vider le cache d’un host avec une URL (configuration varnish) :

acl purge {
        "W.X.Y.Z";
}
sub vcl_recv {
     if (req.url ~ "^/purge-cache$") {
        if (!client.ip ~ purge) {
                error 405 "Not allowed.";
        }
        ban("req.http.host == " + req.http.host + " && req.url ~ .*");
        error 200 "Banned.";
     }
}

Pour rachaîchir, ouvrir http://www.exemple.com/purge-cache

– Rafraichir un objet avec une requête REFRESH (configuration varnish) :

sub vcl_recv {
     if (req.request == "REFRESH") {
        set req.hash_always_miss = true;
        set req.request = "GET";
     }
}

Commande pour rachaîchir :

curl -X REFRESH --header 'accept-encoding: gzip' -o /dev/null http://www.exemple.com/

– Purge une url complète quelque soit le host, les cookies,etc (configuration varnish) :

sub vcl_recv {
     if (req.request == "PURGE") {
        ban("req.url ~ " +  req.url);
        error 200"Purged url " + req.url ;
     }
}

Commande pour rachaîchir :

curl -I -X PURGE http://www.exemple.com/url_a_purge

– Rafraichir un site à partir d’une IP client (configuration varnish) :

acl purge {
        "W.X.Y.Z";
}
sub vcl_recv {
     if (client.ip ~ purge) {
        set req.hash_always_miss = true;
     }
}

– Rafraichir un site à partir d’une IP serveur secondaire (configuration varnish) :

acl purge {
        "W.X.Y.Z";
}
sub vcl_recv {
     if (server.ip ~ purge) {
        set req.hash_always_miss = true;
     }
}

Modifier votre etc/hosts pour pointer votre site sur l’IP secondaire de rafraîchissement

Mar 052012
 

Avec varnish, par défaut quand vous appelez la routine pass,

return(pass);

votre requête sera envoyée directement au backend sans vérifier le cache mais si la réponse est « cachable » http://blog.jeremm.fr/?p=190, Varnish la sauvegardera dans son cache.

Bien sûr cela ne sert souvent à rien car la prochaine requête passera encore par le routine pass, et l’objet dans le cache ne sera pas utilisée.
Mais avec une configuration plus complexe, l’objet en cache pourrait être utilisé.

Pour être sûr que les objets passant par la routine pass ne soit pas cachée, ajoutez :

sub vcl_pass {
        set req.http.X-marker = "pass" ;
}

et dans le vcl_fetch :

if (req.http.X-marker == "pass" ) {
        unset req.http.X-marker;
        set beresp.ttl = 0s ;
}
Mar 052012
 

Pour savoir comment Varnish décide si un objet peut être caché :

Varnish regarde deux paramètres dans l’en-tête HTTP que lui renvoie le backend.

  • La date du paramètre Expires :
  1. Si il est dans le passé, il ne cache pas
  2. Si il est dans le futur, il cachera jusqu’à la date.
  • La valeur du s-maxage ou max-age du paramètre Cache-Control :
  1. Si il est égal à 0, il ne cachera pas
  2. Si il est supérieur à 0, il cachera le nombre de seconde que ce paramètre lui dit (avec ce paramètre, Varnish ne regardera pas le paramètre Expires)

Si aucun des deux paramètres n’est présent, Varnish cachera l’objet avec le temps de rafraichissement par défaut.

Vous pouvez bien sûr ajouter des règles pour forcer ou non des objets dans le cache.