Written by

Deuxième article de notre série destinée à vous présenter les nouveautés de notre reverse-proxy HTTP. Après le pare-feu applicatif, nous vous présentons le cache HTTP frontal que nous avons intégré à notre infrastructure.

punch it star trek GIF @Giphy

Un cache HTTP, qu’est-ce que c’est ?

Un graphique vaut mieux qu’un long discours

Nous avons testé les performances de notre cache fraîchement intégré à notre proxy sur notre blog, servi par une application WordPress. Le résultat obtenu nous laisse à penser que cette fonctionnalité va vous plaire.

Le nombre de requêtes servies par seconde augmente considérablement lorsqu’on active notre cache, passant de 15 req/s à 2604 req/s, soit 173 fois plus de requêtes servies sur une même durée. Le temps mis pour obtenir la réponse à une requête baisse d’autant, passant de 63.65ms à 0.38ms en moyenne. Intéressant, et très simple à activer !

Nous avons réalisé ce benchmark avec ApacheBench en faisant des requêtes vers la page d’accueil de ce blog. Nous avons exécuté chaque tir1) quatre fois pour chaque configuration, avec et sans cache, avant de faire la moyenne des résultats obtenus. Ce blog est hébergé sur un serveur dédié, les différences de performances mesurées sur un serveur mutualisé seront du même ordre. Vous pouvez d’ailleurs faire vos propres tests en vous connectant en SSH à votre serveur, et en exécutant la commande ab avec les mêmes options sur une page de votre site.

Fonctionnement d’un cache

Le cache désigne un système de stockage temporaire de données dans le but d’en accélérer le traitement ultérieur. Un cache HTTP s’occupe de stocker temporairement des documents web comme les pages HTML, les documents CSS, les images, etc. Ce mécanisme est principalement utilisé pour diminuer la latence induite par le serveur lorsqu’il doit servir une page et/ou réduire sa charge de travail.

Lorsqu’un client demande une page à un serveur web, ce dernier va générer une page et l’envoyer sur le réseau. Le cache intercepte la réponse à ce moment, et la stocke dans sa mémoire locale avant de la servir au client.

Schéma de mise en cache d'une resource web
Mis en cache d’une ressource lors de sa requête (icônes : The Noun Project)

Lorsqu’une requête pour la même page est émise par un client, elle sera directement servie par le cache qui détient désormais une copie de la ressource demandée. Le serveur web ne sera plus interrogé.

Schéma d'une resource web servie par un cache
Restitution d’une ressource précédemment mise en cache (icônes : The Noun Project)

Utiliser le cache chez alwaysdata

Vous pouvez activer le cache frontal pour chaque site individuellement en vous rendant simplement dans Sites → Modification → Cache, puis en cochant la case Activer le cache.

Capture d'écran de l'interface d'administration pourla configuration du cache HTTP par site

Il vous faudra régler le TTL pour les pages issues de ce site. Le TTL définit la durée pendant laquelle le cache peut servir une page. Sa valeur doit être sélectionnée avec soin. S’il est bon de choisir un TTL élevé pour un site dont le contenu n’est pas souvent mis à jour ; il sera en revanche judicieux d’abaisser cette valeur dans le cas d’un site dont le contenu change très régulièrement, comme un site de news. Dans ce dernier cas, si le TTL reste élevé, le visiteur peut se retrouver avec une version périmée de la page demandée.

Prenons l’exemple de ce blog. Nous souhaitons nous assurer qu’un visiteur se retrouve avec une version relativement fraîche de la page d’accueil. Lorsque nous ajoutons un article, la page d’accueil cachée auparavant sera périmée. Nous allons donc préférer une valeur de TTL comprise entre 5 et 10 secondes afin de bénéficier des hausses de performances sans risquer de servir la page cachée pendant une durée trop longue.

Cette fonctionnalité est considérée comme en bêta test et susceptible d’évoluer encore.

Cette fonctionnalité est dépendante de la capacité de votre application à autoriser les pages générées à être cachées. Si cette dernière ne l’autorise pas explicitement, il y a un risque que notre proxy ne puisse pas cacher les ressources qui sont servies par elle.

L’implémentation

Nous avons choisi d’écrire en Python2) un module intégrant les spécifications du standard exposées dans la RFC 7234. Le stockage des ressources cachées, quant à lui, est confié à un serveur Redis local permettant l’optimisation de la mémoire utilisée avec très peu d’efforts.

En plus des spécifications liées à la RFC, nous avons implémenté le verbe HTTP PURGE. Cette méthode offre la possibilité de supprimer une entrée dans le cache par le client juste en l’appelant sur son URL. Ceci peut être utile lorsque vous cherchez à forcer le rafraîchissement d’une page mise en cache.


Après la performance, la journalisation ! Dans le prochain et dernier billet de cette série, nous vous présenterons notre système de personnalisation des lignes de logs générées par vos serveurs web. Vous allez désormais pouvoir les formater selon vos besoins.

Notes

Notes
1ab -c 10 -t 60 http://blog.alwaysdata.com/
2parce qu’on aime bien Python chez alwaysdata