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

Sep 302012
 

Création de l’Expires à partir du cache-control max-age si il est présent et différent de 0, puis suppression du max-age.

Ajoutez au début de la configuration :

C{
        #include <string.h>
        #include <stdlib.h>
 
        void TIM_format(double t, char *p);
        double TIM_real(void);
}C

Et dans le vcl_deliver :

if ( resp.http.Cache-Control ~ "max-age" && ! resp.http.Cache-Control ~ "max-age=0" ) {
        C{
                 char *cache = VRT_GetHdr(sp, HDR_RESP, "\016cache-control:");
                 char date[40];
                 int max_age = -1;
                 int want_equals = 0;
                 if(cache) {
                         while(*cache != '\0') {
                                 if (want_equals && *cache == '=') {
                                         cache++;
                                         max_age = strtoul(cache, 0, 0);
                                         break;
                                  }
                                  if (*cache == 'm' && !memcmp(cache, "max-age", 7)) {
                                         cache += 7;
                                         want_equals = 1;
                                         continue;
                                  }
                         cache++;
                         }
                         if (max_age != -1) {
                                 TIM_format(TIM_real() + max_age, date);
                                 VRT_SetHdr(sp, HDR_RESP, "\010Expires:", date, vrt_magic_string_end);
                         }
                 }
        }C
        set resp.http.Cache-Control = regsuball(resp.http.Cache-Control,"max-age=[0-9]+(,)?", "");
        if ( resp.http.Cache-Control ~ "^$") {
                 unset resp.http.Cache-Control;
        }
}

Source : https://www.varnish-cache.org/trac/wiki/VCLExampleSetExpires

Sep 042012
 

Une nouvelle version est sortie. Correction de bug, optimisation de performance
Réf : https://www.varnish-cache.org/releases/varnish-cache-3.0.3

2 commandes ont été ajouté au CLI :
backend.list -> voir la liste des backends et leur état

varnish> backend.list
200
Backend name                   Refs   Admin      Probe
default(127.0.0.1,,82)         2      probe      Healthy 5/5

backend.set_health -> forcer l’état d’un backend, par exemple avec le backend ‘default’ :
– désactiver le backend :

varnish> backend.set_health default sick

– remettre le backend en vérification d’état (probe)

varnish> backend.set_health default auto

– forcer le backend en ligne sans vérification d’état (probe)

varnish> backend.set_health default healthy
Juil 272012
 

Si varnish est bien configuré, il envoie l’IP du client dans le paramètre HTTP X-Forwarded-For.

Pour le voir dans les logs apache2, il faut modifier le LogFormat utilisé et remplacer %h par %{X-Forwarded-For}i :

LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

Si vous avez du https ou d’autre accès au apache2 sans varnish, vous ne verrez pas l’IP client. Pour cela on peut avoir 2 LogFormats différents en fonction de l’IP source de la requête :

LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined_direct
 
SetEnvIf Remote_Addr '^127.0.0.' varnish
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined env=varnish
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined_direct env=!varnish
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