Accélérer dotclear avec Varnish

Depuis ce matin j'étudie Varnish-cache, Pour ce qui ne le saurait pas varnish permet de mettre en cache les page de votre site web et se substitue à Apache pour augmenter de façon très net les performances du serveur. Pour vous donner une idée sur une page statique les performances augmente de l'ordre de 200 fois sur ma machine. Le chiffre est à modérer par le fait que mon serveur apache n'est absolument pas optimisé.

Comment fonctionne varnish ?

Varnish interprète les requêtes http. En fonction de si la ressource est disponible ou pas dans le cache, il questionne le serveur http (Apache dans notre cas) et stocke le résultat en cache avant de le retourner au client. Voici un petit schéma récapitulatif : Fonctionnement de Varnish Ici, j'ai considéré que le client enverra ses requêtes sur le port 8080 au lieu du port 80 par défaut. Il s'agit d'une configuration de test. Pour une utilisation normale, Varnish devra intercepter les requêtes du port 80. Varnish utilise la requête HTTP pour identifier les pages et pas uniquement l'url de la page. Si deux clients ont des requêtes différentes (cookies par exemple) alors la page sera en cache autant de fois qu'il y'a de client ! Il est bien-sûr possible de changer ce comportement comme nous le verrons dans la partie configuration de Varnish. Enfin un problème qui m'a bloqué, les pages générant des cookies ou ayant "must-revalidate" dans le paramètre cache-control du header ne sont pas mises en cache.

Installation de Varnish

L’installation de Varnish est très simple si vous avez une Ubuntu ou une Debian :

  1. curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
  2. echo "deb http://repo.varnish-cache.org/debian/ $(lsb_release -s -c) varnish-2.1" >> /etc/apt/sources.list
  3. apt-get update
  4. apt-get install varnish

Notez que vous avez besoin de Curl.

Configuration de Varnish

La configuration de base

Le fichier de configuration par défaut de Varnish se trouve dans /etc/varnish/default.vcl. Voici la configuration minimale que vous devez avoir si Varnish est installé sur votre machine locale :

  1. # This is a basic VCL configuration file for varnish. See the vcl(7)
  2. # man page for details on VCL syntax and semantics.
  3. #
  4. # Default backend definition. Set this to point to your content
  5. # server.
  6. #
  7. backend default {
  8. .host = "127.0.0.1";
  9. .port = "80";
  10. }

Démarrons Varnish à l'aide de la commande :

  1. pkill varnishd; varnishd -f /etc/varnish/default.vcl -s malloc,256M -T 127.0.0.1:2000 -a 0.0.0.0:8080

Cette dernière tue Varnish si il était précédemment démarré et le (re)démarre en écoutant le port 8080. En allant à l'adresse http://localhost:8080 vous devez arriver sur votre site en local.

Tester les performances de dotclear

Je vais considérer que Dotclear est disponible à l'adresse http://localhost:8080/dotclear. Pour tester la rapidité de l'application nous allons utiliser l"outil ab (apache bench) qui permet de faire des statistiques à partir d'un grand nombre de requêtes. Nous alors donc comparer le nombre de requête par seconde (Requests per second) sur le port 80 (Apache) et sur le port 8080 (Apache+Varnish).

  1. # Bench pour Varnish + Apache
  2. ab -n 100 -c 5 http://localhost:8080/dotclear/
  1. # Bench pour Apache seul
  2. ab -n 100 -c 5 http://localhost:80/dotclear/

Je trouve 5.49 requêtes par seconde pour l'installation avec Varnish contre 7.43 sans. Varnish ralentirait donc Dotclear. En réalité, Dotclear par défaut empêche Varnish de mettre en cache les pages à cause du paramètre max-age à 0. Là solution Pour corriger cela, nous allons modifier le code de Dotclear. /!\ Il est possible de changer le max-age dans la configuration de Varnish. J'y reviendrait dans un prochain article La solution proposer n'est pas propre et non recommandée. Visitez cette page pour plus de détail. Dans le fichier /var/www/dotclear/inc/clearbricks/common/lib.http.php éditons la ligne 237 :

  1. // Cette ligne pose problème pour mettre en cache la page
  2. //$headers[] = 'Cache-Control: must-revalidate, max-age='.abs((integer) self::$cache_max_age);
  3. // On supprime le paramètre max-age
  4. $headers[] = 'Cache-Control: must-revalidate';

Testons à nouveau les performances de Dotclear : 3029.57 requêtes par seconde. Bien plus performant que les 7.43 d'Apache seul !

Conclusion

Le tutoriel s’arrête ici. La configuration de Varnish reste à peaufiner, j'aurai l'occasion d'y revenir dans un futur billet. En attendant je vous conseil de lire la documentation officielle qui est relativement bien faite. Tout ce qui est dans ce billet n'est pas à prendre comme argent comptant. Je ne suis pas un spécialiste de Varnish loin de là. Il est très probable que des erreurs ce soit glissées dans le ticket. Bon courage

 

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

À propos

Photographie

Maxence de Flotte

Développeur cœur PrestaShop

Passionné de nouvelles technologies

PHP, HTML5/CSS3, jQuery, Bootstrap, LESS CSS, ...

Voir mon CV

Mes projets