nginx-etag-module : module de gestion des etags pour Nginx

Le protocole HTTP définit un mécanisme de cache par validation des ressources Web : les Entity Tags. Son intérêt est d’autoriser les requêtes conditionnelles afin d’optimiser la gestion de la bande passante des clients et des serveurs Web. Ainsi, à chaque requête, le serveur calcule et ajoute un Etag, matérialisé par un identifiant unique associé à la ressource et à sa version.
En pratique, la première requête envoie le statut HTTP 200 - OK et l’etag calculé par le serveur. Si le client demande à nouveau la ressource et s’il soumet en information l’etag précédent, le serveur est capable de déterminer sa validité. Si les etags matchent, la ressource est à jour côté client et le serveur renvoie un statut HTTP 304 - Content Not Modified sans les données. Les Etags sont donc un moyen simple et fiable de gestion cache des ressources.
Je vais vous présenter le module que j’ai développé pour effectuer ce job sous Nginx : ngx-http-etag-module. Le calcul de l’etag est indépendant du filesystem afin de permettre une utilisation en cluster. A cela, j’y ai couplé une option permettant de forcer le calcul sur un fichier précis, quelque soit la ressource statique demandée. C’est cette raison qui m’a incité à développer ce module, car elle me permet de conserver le cache des proxys frontaux suite à une mise à jour des fichiers. Seul un touch sur le fichier permet d’invalider l’ensemble du cache et propager les modifications.
Installation
$ git clone git://github.com/bhuisgen/nginx-etag-module.git ./nginx-etag-module
Initialized empty Git repository in /private/tmp/nginx-etag-module/.git/
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 21 (delta 6), reused 0 (delta 0)
Receiving objects: 100% (21/21), 4.62 KiB, done.
Resolving deltas: 100% (6/6), done.
$ cd nginx-etag-module/
Le code de Nginx doit également être récupéré, compilation statique oblige :
$ wget http://nginx.org/download/nginx-0.7.67.tar.gz
--2010-09-03 20:35:46-- http://nginx.org/download/nginx-0.7.67.tar.gz
Résolution de nginx.org (nginx.org)... 81.19.68.137
Connexion vers nginx.org (nginx.org)|81.19.68.137|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 608462 (594K) [application/octet-stream]
Sauvegarde en : «nginx-0.7.67.tar.gz»
100%[==========================================================================================>] 608.462 64,9K/s ds 8,5s
2010-09-03 20:35:54 (70,0 KB/s) - «nginx-0.7.67.tar.gz» sauvegardé [608462/608462]
$ tar xzf nginx-0.7.67.tar.gz
$ cd nginx-0.7.67
$ ./configure --add-module=../
Le script configure doit détecter la présence du module :
adding module in ../
+ ngx_http_etag_module was configured
Comme d’habitude, compilation puis installation :
$ make
$ sudo make install
Configuration
Pour activer la prise en charge des etags :
server {
listen 8000;
server_name localhost;
root /usr/local/www/html;
index index.php;
location / {
etag on;
}
location ~ \.php$ {
include fragments/php.conf;
}
}
Pour rediriger le calcul des etags sur un unique fichier :
server {
listen 8000;
server_name localhost;
root /usr/local/www/html;
index index.php;
location / {
etag on;
etag_file /opt/local/var/www/etag_file
}
location ~ \.php$ {
include fragments/php.conf;
}
}
[gallery ids=“2997,3011” ]