Mise en place du dépôt Varnish et installation
Pour cela, il faut :
- Installer la clef PGP du dépôt Varnish
- Ajouter le dépôt Varnish
- Installer Varnish
curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb http://repo.varnish-cache.org/debian/ $(lsb_release -s -c) varnish-3.0" >> /etc/apt/sources.list.d/varnish.list
apt-get update
apt-get install varnish```
# Activation de varnish et configuration du port 80 a la place du port 6081
```sh
sed -i "#START#s#no#yes#" /etc/default/varnish-
sed -i "s#-a :6081#-a :80#" /etc/default/varnish
sed -i "s#/etc/varnish/default.vcl#/etc/varnish/production.vcl#" /etc/default/varnish
Le fichier de configuration
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Appelé au début d’une requête, après que la requête complète est été reçue et analysée.
Son but est de décider si il faut exécuter la requête, comment le faire, et,
le cas échéant, quel backend utiliser.
vcl_recv
La routine vcl_recv peut se terminer avec le retour return() sur l’un des mots-clés suivants:
code d’erreur [raison]
Retourner le code d’erreur spécifié sur le client et d’abandonner la demande.
pass : Switch en mode pass, passe à l’vcl_pass.
pipe : Switch en mode pipe, passe à l’vcl_pipe.
lookup : Recherchez l’objet demandé dans le cache.
Cela passera par la VCL vcl_hit ou vcl_miss, suivant si l’objet est dans le cache ou non.
sub vcl_recv {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For ", " client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
vcl_pipe
La VCL pipe transfère la demande au backend ainsi que les données sans les changer.
Aucune modification ne sera faite par varnish
La routine vcl_pipe peut se terminer avec le retour return() sur l’un des mots-clés suivants:
- error code [raison] : Retourne l’erreur au client et abandonne la requête
- pipe : Procède au mode pipe
sub vcl_pipe {
return (pipe);
}
vcl_pass
La VCL pass transmet la demande au backend et la réponse du backend est transmise au client sans être mise en cache.
Cela se passe lors de la même connexion
La VCL pass se termine par :
pass : Procède au mode pass.
error code [raison] : Retourne l’erreur au client et abandonne la requête
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation
sub vcl_pass {
return (pass);
}
vcl_hash
La VCL hash permet d’ajouter des données a la table de hachage
sub vcl_hash {
set req.hash += req.url;
if (req.http.host) {
set req.hash += req.http.host;
} else {
set req.hash += server.ip;
}
return (hash);
}
vcl_hit
La VCL hit est utilisé lors de l’accès a une donnée présente dans le cache
Cette VCL se termine par :
deliver : Délivre l’objet caché au client cela passera par la VCL délivre
error code [raison] : Retourne l’erreur au client et abandonne la requête
pass : Transmet le traitement a la VCL pass
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation
sub vcl_hit {
if (!obj.cacheable) {
return (pass);
}
return (deliver);
}
vcl_miss
La VCL miss est utilisé lorsqu’un objet est absent du cache et décide si il faut ou non si il faut transmettre la demande au backend
Cette VCL se termine par :
pass : transmet la demande a la VCL pass
fetch : Transmet la requête au backend et transmet la demande a la VCL ketch
error code [raison] : Retourne l’erreur au client et abandonne la requête
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation
sub vcl_miss {
return (fetch);
}
vcl_fetch
La VCL fetch est appelé après qu’un document soit reçu avec succès d’un backend
Cette VCL se termine par :
deliver : Met l’objet en cache et le délivre au client, la VCL deliver sera appelé.
hit_for_pass : Utilisé dans la VCL ketch, cela va créé un objet hit_for_pass
A noter que le TTL pour l’objet hit_for_pass sera configurer avec la valeur présente dans beresp.ttl.
Le contrôle sera délégué au vcl_deliver pour la requête en cours, mais sera transmis directement au vcl_pass basés sur l’objet hit_for_pass pour toutes les sous-requêtes suivantes:
error code [raison] : Retourne l’erreur au client et abandonne la requête
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation
sub vcl_fetch {
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}
return (deliver);
}
vcl_deliver
La VCL deliver est utilisé avant qu’un objet caché soit délivré au client
Cette VCL se termine par :
deliver : Délivre l’objet au client.
error code [raison] : Retourne l’erreur au client et abandonne la requête
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation
sub vcl_deliver {
return (deliver);
}
vcl_error
La VCL error est appelé lors d’une erreur, que ce soit du a une erreur varnish ou lié au backend.
La routine vcl_error peut se terminer par un des retour suivant :
deliver : Livrer l’objet d’erreur au client.
restart : Redémarrez la transaction. Augmente le compteur redémarre.
Si le nombre de redémarrages est plus élevé que max_restarts varnish émet une erreur guru meditation.
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic {"
<!--?xml version="1.0" encoding="utf-8"?-->
"} obj.status " " obj.response {"</pre>
<h1>Error "} obj.status " " obj.response {"</h1>
<pre>"} obj.response {"</pre>
<h3>Guru Meditation:</h3>
<pre>XID: "} req.xid {"</pre>
<hr />
<pre>Varnish cache server
"};
return (deliver);
}