mars
2009
.htaccess est pratique sous Apache, il permet de modifier une certaine partie ( dépendant de AllowOverride) de la configuration, par dossier.
Mais tout ce qui est pratique possède un revers de médaille.
Le problème est que Apache cherche ce fichier dans tous les répertoires et sous-répertoires du système de fichier (File System), en appelant la fonction système open().
Plus étonnant encore, il cherche même dans les dossiers précédants le DocumentRoot !
Un strace sur une application avec .htaccess peut donner ceci (avec un DocumentRoot sur /home/julien/Bureau/ZFBook/):
open(« /.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/ZFBook/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/ZFBook/html/.htaccess », O_RDONLY|O_LARGEFILE) = 9
open(« /.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/ZFBook/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/ZFBook/html/.htaccess », O_RDONLY|O_LARGEFILE) = 9
open(« /home/julien/Bureau/ZFBook/html/css/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open(« /home/julien/Bureau/ZFBook/html/css/styles.css/.htaccess », O_RDONLY|O_LARGEFILE) = -1 ENOTDIR (Not a directory)
Remarquez qu’il y a 2 fois la même suite d’appels, tout simplement car nous chargeons la page principale, puis un style CSS.
Imaginez un site avec plus de ressources (50 images, 4 JS et 3 CSS) … Dans de tels cas, un reverse proxy avec Nginx ou Lighttpd est plus que recommandé (un tutoriel viendra )
Conclusion : pour ne pas plomber les performances, désactivez la gestion des .htaccess et mettez vos règles dans vos Vhosts.
Ceci est d’autant plus vrai que l’arborescence n’est profonde, il s’en suivrait alors tout un tas d’appels sur le FS, inutiles et lourds à gérer à forte charge.
4 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
Non, le seul moyen c’est AllowOverride None
Les htaccess s’héritent les uns les autres, c’est pour cela qu’il cherche partout.
C’est une solution de simplicité, mais on voit clairement son impact négatif sur les performances.
Après il faut mesurer en terme de chiffres, mais clairement plus l’arborescence est profonde et complexe, et plus ça sera couteux.
Je pense bencher ça dans un tuto courant 2009
Quant à sa recherche *avant* le DocRoot, j’ai posté sur la liste users@ de Apache et j’attends une réponse. Je posterai sur dev@ si j’ai pas de réponse.
Edit> Ok j’ai la réponse, il faut mettre un AllowOverride None sur « / » spécifiquement
Question très idiote puisque le manuel indique bien ce comportement (http://httpd.apache.org/docs/2.2/misc/perf-tuning.html)
Les appels kernel se font donc sur la descente des répertoires, ce qui est le comportement logique et normal (sont concernés tous les répertoires cités dans une section de mapping [Directory ou Alias*])
C’est ce que j’avais lu (en moins détaillé), donc ça ne m’étonne pas vraiment.
Ce qui m’étonne, c’est que je n’ai jamais vu de solution à ce problème.
N’y a-t-il donc aucun moyen d’indiquer à Apache où des .htaccess peuvent se trouver, pour qu’il ne cherche pas ailleurs ?
En effet.
Mais pourquoi donc va-t-il chercher au dessus du DocumentRoot ?
Très intéressant.