À la découverte de...
Varnish
Accélérez votre site en soulageant vos serveurs
Le monde sans Varnish
Serveur web
(Apache, IIS, Nginx, ...)
Base de données
(MySQL, Oracle, MongoDB, ...)
Le monde sans Varnish
Le monde sans Varnish
Une architecture idéale dans 80% des cas !
Mais pas dans les 20% restants...
Les problèmes rencontrés
Les problèmes côté serveur :
- La génération des pages occupe trop de ressources
- La base de données sature
- Le site peut être victime d'un piratage (/admin ...)
- Le site peut être victime de son succès (pub TV, ...)
- Les threads sont majoritairement occupés à délivrer les fichiers statiques (images, ...), ça laisse moins de place pour les traitements plus lourds
- Complications lorsqu'il faut utiliser plus d'un serveur web
Les problèmes rencontrés
Les problèmes côté client :
- « Le site est lent à s'afficher !!!! »
- « Les pages et images mettent trop de temps à charger !!! »
- « Sur telle page en erreur on peut voir la version du serveur Apache et PHP ! »
- « Je ne veux pas que mon site soit inaccessible, même lors des mises à jour ! »
La solution à tous ces problèmes
s'appelle...
VARNISH
Comment ça marche
MISS
Comment ça marche
HIT
L'objectif ?
Techniquement...
- Tout est stocké en mémoire : rapide
- Installation facile (apt-get install varnish)
- 1 serveur suffit à un site important
- Varnish peut jouer le rôle de load balancer
pour de multiples backends.
La Configuration
Elle repose sur des fichiers au format VCL
Une configuration par défaut suffisante
Relativement simple à configurer
Pas besoin de compiler :-)
LA LOGIQUE DU VCL
repose sur des fonctions à surcharger :
- vcl_recv : traitement de la requête reçue par Varnish
-
vcl_hash : calcul de la clé. Par défaut : l'URL.
- vcl_fetch : traitement de la réponse donnée par Apache
- et quelques autres encore :
- vcl_error
- vcl_hit
- vcl_miss
- vcl_deliver
- ...
La logique du VCL
Quand Varnish reçoit une requête,
plusieurs actions s'offrent à lui :
- pass : ne regarde pas en cache, demande au backend
- lookup : regarde dans le cache
- pipe : transmets tout au backend sans analyser les données
- error : arrête tout et retourne une "erreur" au client
un petit exemple...
backend mon_site { # IP du serveur Apache
.host = "172.24.20.160";
.port = "80";
}
sub vcl_recv { # Surcharge réception requête client
set req.backend = mon_site;
if ( req.url ~ "^/admin/" ) {
return (pass);
}
}
sub vcl_fetch { # Surcharge retour d'Apache
if ( req.url ~ "\.(png|gif|jpg)$" ) {
set beresp.ttl = 1h;
}
}
VCL : comportement par défaut
- Seules les requêtes GET et HEAD sont mises en cache
- Les requêtes d'authentification Apache ne sont pas mises en cache
- Les requêtes avec des cookies ne sont pas mises en cache
- Les réponses du serveur qui envoient des cookies ne sont pas mises en cache
- Les erreurs du serveur (>= 500) ne sont pas mises en cache
- Le temps de cache se base sur les en-têtes de la réponse
- Le hash est l'URL
Le contenu dynamique
Les cookies
Objectif :
supprimer ceux qui ne servent pas
Les cookies
Objectif :
supprimer ceux qui ne servent pas
sub vcl_recv { # Surcharge réception requête client
if ( req.url ~ ".(jpg|gif|png|pdf)" ) {
unset req.http.Cookie;
}
}
sub vcl_fetch { # Surcharge retour d'Apache
if ( req.url ~ ".(jpg|gif|png|pdf)" ) {
unset beresp.http.Cookie;
}
}
La purge
Objectif :
invalider les caches
sub vcl_recv { # Surcharge réception requête client
if ( req.request == "PURGE" ) {
ban_url( req.url ); # L'URL est une expression régulière
error 200 "Tout marche bien navette";
}
}
PURGE / HTTP/1.1
Les ESI
Edge Side Includes
Les ESI
Les ESI
/bienvenue.php :
<html>
<h1>Bienvenue,</h1>
<esi:include src="/nom.php"/>
<p>et bonne visite !</p>
</html>
/nom.php : <h2><?php print $user->name ?></h2>
les outils complémentaires
varnishstat
Les outils complémentaires
varnishtop -b -i TxURL
Les outils complémentaires
- varnishadm : chargement à la volée de configurations VCL
- varnishncsa : génération de logs au format Apache
étude de cas :
Varnish & DPI 24/7
pour LeSoir.be et SudInfo.be
par @exxxxxodus
Quelques snippets
Redirection HTTP :
sub vcl_recv {
if( req.url ~ "^/elections$" ){
error 701 "http://elections.lavoixdunord.fr"
}
}
sub vcl_error {
# Code d'erreur perso pour faire des redirections 301 (permanentes)
if( obj.status == 701 ){
set obj.http.Location = obj.response;
set obj.status = 301;
return(deliver);
}
}
Quelques snippets
Contourner la Same-Origin policy :
# Backend pour le site tiers
backend prestataire_sports {
.host = "www.sports.fr";
.port = "80";
}
# Reverse proxy pour Sports.fr
sub vcl_recv {
if( req.url ~ "^/sports/resultats-foot.json" ){
set req.backend = prestataire_sports;
set req.http.host = "www.sports.fr";
set req.url = "/resultats/football.json";
return (pipe);
}
}
monsite.com/sports/resultats-foot.json appelle www.sports.fr/resultats/football.jsonInstallation en local
Objectif : pouvoir consulter le site avec et sans Varnish
VirtualHost Apache :
<VirtualHost *:80>
ServerName monsite.local
ServerAlias *.monsite.local
Fichier /etc/hosts :
127.0.0.1 monsite.local
127.0.0.2 varnish.monsite.local
Installer Varnish :
# Ajouter le dépôt : https://www.varnish-cache.org/installation/ubuntu
sudo apt-get install varnish
Installation en local
Modifier la configuration Varnish :
# Modifier le fichier /etc/default/varnish
[...]
DAEMON_OPTS="-a 127.0.0.2:80 \
[...]
Redémarrez le service Varnish et voila !varnish.monsite.local et monsite.local sont accessibles dans votre navigateur.
Des questions ?
TOMHTML, décembre 2013
Varnish
By Tom Acheté-Eymel
Varnish
À la découverte de cet accélérateur de sites web...
- 2,437