Je cherche un moyen d'effacer le cache pour tous les domaines et toutes les URL dans Varnish.
Actuellement, il me faudrait émettre des commandes individuelles pour chaque URL, par exemple:
curl -X PURGE http://example.com/url1
curl -X PURGE http://example.com/url1
curl -X PURGE http://subdomain.example.com/
curl -X PURGE http://subdomain.example.com/url1
// etc.
Pendant que je cherche un moyen de faire quelque chose comme
curl -X PURGE http://example.com/*
Et cela effacerait toutes les URL de example.com, mais également toutes les URL des sous-domaines de example.com, essentiellement toutes les URL gérées par Varnish.
Une idée comment y parvenir?
Ceci est mon fichier VCL actuel:
vcl 4.0;
backend default {
.Host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
# Command to clear the cache
# curl -X PURGE http://example.com
if (req.method == "PURGE") {
return (purge);
}
}
Avec Varnish 4.0, j'ai fini par l'implémenter avec la commande ban
:
sub vcl_recv {
# ...
# Command to clear complete cache for all URLs and all sub-domains
# curl -X XCGFULLBAN http://example.com
if (req.method == "XCGFULLBAN") {
ban("req.http.Host ~ .*");
return (synth(200, "Full cache cleared"));
}
# ...
}
Eh bien, je suggère simplement de redémarrer le vernis. Cela va purger tous les fichiers car varnish garde le cache en mémoire.
Exécuter: Sudo /etc/init.d/varnish restart
En supposant qu'il n'y ait aucun changement d'URL ou de clé de cache interne, pour un vidage complet, l'approche la plus simple consisterait à redémarrer Varnish, car celui-ci conserve son cache en mémoire.
Si un redémarrage rapide n'est pas acceptable, le BAN suggéré par Rastislav est une excellente approche. Il devra rester actif aussi longtemps que votre TTL le plus long. Par conséquent, si vous avez souvent besoin d’une flush complète, la liste BAN sera à peu près permanente, car le ler d'interdiction (qui recherche les BAN qui ne sont plus pertinents) peut toujours penser que est utile
Donc dans votre cas, votre VCL serait:
# Highly recommend that you set up an ACL for IPs that are allowed
# to make the BAN call
acl acl_ban {
"localhost";
"1.2.3.4"/32;
}
sub vcl_recv {
if (client.ip ~ acl_ban && req.method == "BAN") {
ban("req.http.Host == " + req.http.Host);
# Throw a synthetic page so the request won't go to the backend.
return(synth(200, "Ban added"));
}
}
Cependant, comme l'a noté Carlos dans les commentaires, cela créera en fait une invalidation lazy (et ne sera donc supprimé qu'au moment de la demande). Si vous voulez que les objets soient réellement purgés par le background lurker de temps en temps, vous pouvez plutôt effectuer les opérations suivantes:
# Highly recommend that you set up an ACL for IPs that are allowed
# to make the BAN call
acl acl_ban {
"localhost";
"1.2.3.4"/32;
}
sub vcl_recv {
if (client.ip ~ acl_ban && req.method == "BAN") {
# see below for why this is obj. rather than req.
ban("obj.http.Host == " + req.http.Host);
# Throw a synthetic page so the request won't go to the backend.
return(synth(200, "Ban added"));
}
}
sub vcl_backend_response {
# add any portions of the request that would want to be able
# to BAN on. Doing it in vcl_backend_response means that it
# will make it into the storage object
set beresp.http.Host = bereq.http.Host;
}
sub vcl_deliver {
# Unless you want the header to actually show in the response,
# clear them here. So they will be part of the stored object
# but otherwise invisible
unset beresp.http.Host;
}
Puis faire la chasse:
curl -X BAN http://example.com;
Purger tout le cache Varnish de la ligne de commande (invalider tout le cache):
varnishadm "ban.url ." # Matches all URLs
Remarque: commande est purge.url dans Varnish 2.x.
Nous pouvons également interdire par un nom d'hôte:
varnishadm "ban req.http.Host == xxx.com"