try_files, une nouvelle feature pour nginx
Par skateinmars le jeudi 25 décembre 2008, 07:58 - Lien permanent
Je sais, ca fait un bail que j'avais plus bloggué. A côté mr_pouit et
gpocentek ont même l'air productifs (mais bon, je peut toujours me dire que je
suis plus productif que Lutin tout de même
:p).
Enfin bref, la date et l'heure sont parfaites pour annoncer mon billet cadeau
de noël sur cette nouvelle feature du serveur web nginx, try_files.
Tout commence plus ou moins sur ce thread par un Igor Sysoev (le développeur de nginx donc) qui une fois de plus râle sur l'utilisation abusive des blocs if dans les fichiers de config, notamment lors de tests d'existence d'un fichier. Igor annonce donc l'implémentation d'une fonctionnalité pour rendre tout cela plus propre. La syntaxe est rapidement définie et le nom est choisi après une courte discussion : try_files.
Mais de quoi s'agit-il exactement ? C'est assez simple, prenez ce bout de config :
location / {
if (-f $request_filename) {
break;
}
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://mongrel;
break;
}
}
Ce qui donne : pour toutes les URLs (car elles correspondent toutes à "/"),
on teste si le fichier demande existe. Si oui, on arrête de lire la suite des
règles et on sert le fichier. Sinon, on continue et teste après si un dossier
correspondant au fichier demandé existe avec le fichier "index.html" à
l'intérieur. Si c'est le cas on arrête la suite pour le servir (avec un
rewrite). On fait ensuite de même en cherchant un fichier correspondant au nom
de fichier demandé suivi de ".html".
Si tout cela ne marche pas (notez qu'on teste si le fichier n'existe pas encore
une fois, ce qui pourrait être omis) on passe la requête au serveur nommé
"mongrel" (défini auparavant dans un bloc upstream).
Malgré mes piètres explications, vous l'aurez compris, on cherche à servir les
"vrais" fichiers et les fichiers de cache avant de passer en dernier recours la
requête au serveur d'application (qui héberge donc notre appli qu'elle soit en
ruby, python, php (avec fastcgi éventuellement) ou autre).
Ce type de config est extrèmement courant pour les applications rails ou nginx est couplé avec mongrel ou thin. Et c'est donc cela que try_files améliore. Voyez plutôt :
location / {
try_files $uri $uri/index.html $uri.html @mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
Pas mal non ? (sisi, quand même !) On donne simplement a try_files des urls
à essayer. Le dernier argument est une "named location" (emplacement nommé ?),
de type @nom. (les named location existent depuis longtemps mais ne sont pas
très répandus, au grand dam d'Igor).
Ce dernier paramètre sera donc utilisé quand les autres auront échoué (les
named locations "existent" toujours). Je ne sais pas si ce "fallback" est
obligatoire ou si une erreur 404 est envoyé au cas ou tous les essais de
try_files échouent mais il semble nécessaire d'après Igor.
Je pense qu'Igor espère aussi une plus grande utilisation des named locations
grâce à cette feature.
Cette directive est donc arrivée dans nginx 0.7.27 (la
branche de développement), et un patch est
disponible pour nginx 0.6.34 (bon, faut que je migre mon 0.5.x de prod
moi....).
Ajoutez à cela la possibilité d'utiliser des variables dans les directives
fastcgi_pass et proxy_pass (ce qui permettra de rendre ses fichiers de config
plus réutilisables), toujours depuis la version 0.7.27.
Pour plus d'infos vous pouvez donc consulter la mailing-list de nginx
(notamment les threads sus-cités) en attendant qu'une âme charitable mette à
jour le wiki.
Mais, que faites vous encore sous Apache ou Lighttpd ?
PS: Joyeux Noël à tous les utilisateurs de serveurs webs, d'un côté ou de l'autre du tuyau :-)