Cacher un site wordpress derrière le proxy cache Varnish

Petite recette afin de mettre en place un proxy-cache Varnish pour un site wordpress pour Debian Wheezy … Pour ce cas d’espèce, toute la configuration nécessaire impacte le fichier /etc/varnish/default.vcl :

a/ Définir le « backend » correspondant au site à cacher :

backend wordpress {
.host = "192.168.0.1";    # IP du serveur Web à cacher
.port = "80";
}

b/ Définir la liste des adresse autorisées à purger le cache :

acl purge_wordpress {
"192.168.0.1";                    # C'est généralement le serveur Web qui est autorisé à purger le cache
}

c/ Définir les règles nécessaires au bon fonctionnement du site :

# Penser à bien tester l'ensemble des alias du site
if (req.http.host == "www.site-wordpress.local" || req.http.host == "site-wordpress.local"  || req.http.host == "alias-site-wordpress.local"  || req.http.host == "www.alias-site-wordpress.local") {
set req.backend = wordpress;
set req.grace = 2m;

# Ajuster l'en-tête X-Forwarded-For
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;

# Supprimes les cookies has_js, CloudFlare/Google Analytics __* et statcounter is_unique
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js|is_unique)=[^;]*", "");
# Supprimer le préfixe ";", si présent.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

# Les pages d'aministration et de login ne doivent pas être cachées mains retransmises au site.
if (req.url ~ "/wp-(login|admin|cron)") {
return (pass);
}

# Supprimer le cookie wp-settings-1
set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");

# Supprimer le cookie wp-settings-time-1
set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");

# Supprimer le cookie wp test
set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(;)?", "");

# Ne stocker dans le cache que que contenu statique du thème (pas les images téléchargées par les utilisateurs)
# dans la mesure où le contenu des répertoires wp-content/uploads pourrait s'avérer très lours sur de gros sites et
# saturer rapidement le cache
if (req.url ~ "wp-content/themes/" && req.url ~ "\.(css|js|png|gif|jp(e)?g)") {
unset req.http.cookie;
}

# Même si aucun cookie n'est présent, le répertoire uploads ne sera pas caché en raison de sa taille potentielle
if (req.url ~ "/wp-content/uploads/") {
return (pass);
}

# Toutes les pages contenant un captcha doivent également être exclues du cache (à personnaliser au cas par cas)
if (req.url ~ "^/contact/" || req.url ~ "^/links/domains-for-sale/") {
return(pass);
}

# Vérifier les cookies spécifiques à wordpress et dans ce cas passer directement au backend
if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_") {
return (pass);
}
# Autoriser la PURGE du cache depuis la liste d'adresses précédemment définie
if (req.request == "PURGE") {
if (!client.ip ~ purge_wordpress) {
error 405 "Not allowed.";
}
return (lookup);
}

# Ne pas cacher les requêtes comportant l'en-tête no-cache
if (req.http.Cache-Control ~ "no-cache") {
return (pass);
}

# Cacher tout le reste ...
return (lookup);
}

Un petit rechargement de Varnish, et le tour est joué !

posté le 14. octobre 2014 à 11:30 am par info · Permalink
Catégories : Administration système, web, wordpress

Ajoutez un commentaire