2 votes

Pourquoi ai-je un faible taux de réussite moyen de cache dans Varnish?

Quelqu'un sait pourquoi nous obtenons un taux de réussite du cache très bas en moyenne lorsque nous utilisons Wordpress (avec Varnish et Nginx) ?

Les statistiques de Varnish montrent :

Taux de réussite : 10 100 518 Moyenne de réussite : 0.4143 0.2690 0.1948

Une idée de comment résoudre ce problème ? Mon fichier default.vcl de Varnish est :

# Il s'agit d'un fichier de configuration VCL de base pour Varnish. Voir la page de manuel vcl(7)
# pour plus de détails sur la syntaxe et la sémantique VCL.
#
# Définition du backend par défaut. Définissez ceci pour pointer vers votre serveur de contenu
#
backend default {
    .host = "77.81.240.177";
    .port = "8080";
}

acl purge {
    "77.81.240.177";
}

sub vcl_recv {

    # Ajouter un en-tête unique contenant l'adresse du client
    remove req.http.X-Forwarded-For;
    set    req.http.X-Forwarded-For = req.http.rlnclientipaddr;

    # Assurons-nous que nous ne compressons pas déjà les formats compressés.
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?.*|)$") {
            remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            remove req.http.Accept-Encoding;
        }
    }

    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 405 "Non autorisé.";
        }
        return(lookup);
    }

    if (req.url ~ "^/$") {
        unset req.http.cookie;
    }
}

sub vcl_hit {
    if (req.request == "PURGE") {
        set obj.ttl = 0s;
        error 200 "Purgé.";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "Pas en cache.";
    }

    if (!(req.url ~ "wp-(login|admin)")) {
        unset req.http.cookie;
    }

    if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
        unset req.http.cookie;
        set req.url = regsub(req.url, "\?.$", "");
    }

    if (req.url ~ "^/$") {
        unset req.http.cookie;
    }
}

sub vcl_fetch {
    if (req.url ~ "^/$") {
        unset beresp.http.set-cookie;
    }

    if (!(req.url ~ "wp-(login|admin)")) {
        unset beresp.http.set-cookie;
    }

    if (req.url ~ "^/w00tw00t") {
        error 403 "Non permis";
    }
}

4voto

3molo Points 4320

Une bonne approche consiste à inspecter le trafic avec varnishlog afin de voir ce qui fait que quelles règles s'appliquent.

Comme vous n'imposez pas de TTL, je suppose que le site wordpress envoie des en-têtes Cache-Control comme "max-age: 0", ou "no-cache" "private" ou quelque chose, et varnish honore de tels en-têtes à moins que vous ne lui disiez spécifiquement de ne pas le faire, par exemple :

 sub vcl_fetch {
     if (!(req.url ~ "wp-(login|admin)")) {
         unset beresp.http.set-cookie;
         set beresp.ttl = 3600s;
     }

La première règle dans vcl_fetch n'a pas de sens, car la deuxième règle supprimera tous les set-cookies pour toutes les URLs sauf wp-login/wp-admin.

Ajoutez une configuration à vcl_deliver pour afficher des en-têtes qui indiquent s'il s'agit d'un hit ou non :

sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "HIT";
        } else {
                set resp.http.X-Cache = "MISS";
        }
     return (deliver);
}

D'autres commentaires sur votre configuration :

Dans vcl_recv, vous faites "unset req.http.cookie" si l'URL n'est pas wp-login ou wp-admin, ce qui signifie que si un utilisateur se connecte à /wp-login puis va sur "/", vous supprimerez son cookie. Vous devez uniquement supprimer les cookies dans vcl_recv pour les URLs qui ne devraient jamais en avoir besoin, c'est-à-dire .(js|css|png|jpg) etc, et supprimer plutôt le set-cookie dans vcl_fetch.

2voto

CGriffitt Points 171

Wp-varnish

Découvrez wp-varnish - Un plugin pour WordPress qui purgera le contenu dans Varnish lorsque le contenu dans WordPress est modifié. Il est également livré avec un VCL d'exemple qui devrait vous donner un meilleur taux de hits

Exemple de VCL

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

acl purge {
  "localhost";
}

sub vcl_recv {
  if (req.request == "PURGE") {
    if(!client.ip ~ purge) {
      error 405 "Non autorisé.";
    }
    return(lookup);
  }

  if (req.request != "GET" &&
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
    return (pipe);
  }

  if (req.request != "GET" && req.request != "HEAD") {
    return (pass);
  }

  if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
    return (pass);
  }

  remove req.http.cookie;
  return (lookup);
}

sub vcl_hit {
  if (req.request == "PURGE") {
    purge;
    error 200 "Purgé.";
  }
}

sub vcl_miss {
  if (req.request == "PURGE") {
    purge;
    error 200 "Purgé.";
  }
}

sub vcl_fetch {
  if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
    return (hit_for_pass);
  }

  set beresp.ttl = 24h;
  return (deliver);
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X