1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !
Utiliser Varnish sur Serveur Cloud
Ce guide présente plusieurs exemples d'utilisation de Varnish sur Serveur Cloud Infomaniak.
⚠️ Pour de l'aide supplémentaire contacter un partenaire ou remplir un appel d'offres — lire aussi le rôle de l'hébergeur
Configuration de Varnish
Voici à quoi pourrait ressembler un fichier de configuration de base avec quelques cas courants et différentes actions/règles dans un seul exemple:
vcl 4.0;
# This should not be modified
backend default {
.host = "127.0.0.80";
.port = "80";
}
# An ACL is an "Access control list", which defines a list of IPs, later to be reused in a rule, for example "Who can purge the cache"
acl purge {
"localhost";
"1.2.3.4"; # My Home IP
"42.42.42.0"/24; # My company's public IP range
! "42.42.42.7"; # Except some annoying colleague
}
# Happens when varnish first gets the request, before sending it to the backend
sub vcl_recv {
# Allow purging
if (req.method == "PURGE") {
# Not from an allowed IP? Then die with an error.
if (!client.ip ~ purge) { # purge is the ACL defined at the begining
# 'synth' is a function that returns a page (without asking the backend) that will not get cached.
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
# If you got to this stage (and didn't error out above), purge the cached result
return (purge);
}
# Allow purging all images, for example
if (req.method == "PURGEALL" && req.url == "/images") {
if (!client.ip ~ purge) {
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
# The 'ban' function is a built-in that allows to invalidates all objects in cache that match the given expression
ban("req.url ~ \.(jpg|png|gif|svg)$");
return (synth(200, "Purged images."));
}
# Pages with authorization are not cached
if (req.http.Authorization) {
# With the 'pass' action, the request will be directly passed from the backend without entering the cache
return (pass);
}
}
# Happens after we have read the response headers from the backend.
# Here you clean the response headers, define if the request must get cached, for how much time, etc.
sub vcl_backend_response {
# Cache all images for 1 day by default
if (beresp.http.content-type ~ "image") {
set beresp.ttl = 1d;
}
# If server set a "uncacheable" header, do not store the response in cache
if (beresp.http.uncacheable) {
set beresp.uncacheable = true;
}
}
Purge Ă partir de l'interface CLI
À partir de là , les règles énoncées dans la configuration ci-dessus fonctionnent sur toutes les demandes, donc si le site configuré est "domain.xyz", vous pouvez simplement utiliser l'outil CLI "curl" et faire ce qui suit:
$ curl -X PURGE https://domain.xyz/
<!DOCTYPE html>
<html>
<head>
<title>200 Purged</title>
</head>
<body>
<h1>Error 200 Purged</h1>
<p>Purged</p>
<h3>Guru Meditation:</h3>
<p>XID: 2</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
Et là , la page d'accueil a été purgée. Ou pour purger une autre URL, il suffit de faire pointer la requête vers cette dernière:
$ curl -X PURGE https://domain.xyz/some_path/some_file.html
<!DOCTYPE html>
<html>
<head>
<title>200 Purged</title>
</head>
<body>
<h1>Error 200 Purged</h1>
<p>Purged</p>
<h3>Guru Meditation:</h3>
<p>XID: 4</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
Ou, comme indiqué dans la configuration VCL, purger toutes les images:
$ curl -X PURGEALL https://domain.xyz/images
<!DOCTYPE html>
<html>
<head>
<title>200 Purged images.</title>
</head>
<body>
<h1>Error 200 Purged images.</h1>
<p>Purged images.</p>
<h3>Guru Meditation:</h3>
<p>XID: 32770</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
Purge Ă partir d'un CMS
C'est un peu plus difficile d'illustrer ce cas car il existe de nombreuses façons de gérer la mise en cache depuis un backend. Dans l'exemple de configuration ci-dessus, un contrôle sur l'en-tête "Uncacheable" est ajouté, qui désactive la mise en cache. Avec cette option, n'importe quel CMS pourrait simplement définir cet en-tête sur la réponse pour désactiver la mise en cache de cette requête p.ex.
A partir de n'importe quel code PHP et avec la configuration ci-dessus, vous pouvez simplement envoyer une requĂŞte HTTP et utiliser cet extrait pour effectuer un PURGE du cache:
<?php
if ($curl = curl_init("http://127.0.0.1/some_url")) {
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "PURGE",
CURLOPT_HTTPHEADER => [
"Host: {$_SERVER['HTTP_HOST']}"
]
]);
curl_exec($curl);
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200) {
echo "Cache purged!";
}
curl_close($curl);
}
En savoir plus
Liens utiles concernant le langage de configuration Varnish (VCL) pour contrĂ´ler le traitement des demandes, le routage, la mise en cache et plusieurs autres aspects: