À la découverte de...

Varnish


Accélérez votre site en soulageant vos serveurs






par TOMHTML, décembre 2013

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
GET /sports
"sports" ? Je ne connais pas...
GET /sports
C'est bon je l'ai, je te le donne

Comment ça marche



HIT
GET /sports
"sports" ? J'ai ! Le voila

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

Exemple de page : /bienvenue.php

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


http://www.eldefors.com/varnish-command-line-tools/

Les outils complémentaires

varnishtop -b -i TxURL


http://blogs.osuosl.org/gchaix/2009/10/12/pressflow-varnish-and-caching/

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.json

Installation 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,435