Configuration de Varnish

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);
}

Suggestions de lecture :

comments powered by Disqus