Performance désastreuse de mod_rewrite dans .htaccess

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

04 avr. 2006, 01:40

J'ai posté ce topic chez Développez @ http://www.developpez.net/forums/viewtopic.php?t=482035 parce qu'ils ont une section Apache avec peut-être plus de passage qu'ici

Je suis en train de tester certaines choses avec mod_rewrite, et je me suis aperçu qu'en mettant les règles dans un .htaccess les pages étaient beaucoup plus lentes qu'en les mettant dans httpd.conf. Les stats sont dans l'autre topic, mais pour vous donner un ordre d'idée:
  • page html - 1300 pages/s,
  • page PHP 5.1.2 sans opcode cache - 500 pages/s (un simple readfile()),
  • RewriteRule dans httpd.conf - 1000 pages/s
  • RewriteRule dans .htaccess - 50 pages/s (cinquante, vous avez bien lu)
Comme vous pouvez le voir, en utilisant le chemin absolu vers le fichiers dans le RewriteRule dans le httpd.conf on obtient de très bons résultats. Malheureusement il semble impossible de faire de même avec un .htacces... :?

Si quelqu'un a une idée... merci ;)

ViPHP
ViPHP | 1380 Messages

04 avr. 2006, 07:43

Je suppose que tu as déjà lu ceci:
http://httpd.apache.org/docs/2.0/howto/ ... .html#when

Sauf si tu modifies dynamiquement tes rewrite rules, il vaut mieux les mettre dans le fichier de config du serveur. Et encore, il doit être possible de le faire également de manière dynamique en "reloadant" ce fichier de config sans arrêter le serveur.
ripat

ViPHP
ViPHP | 1380 Messages

04 avr. 2006, 08:31

Pour info, j'ai fait le test sur mon serveur de dvp (Linux-Apache2-Pentium4-768Mb de mem)

(rewrite de foo vers bar.html)

Code : Tout sélectionner

htaccess foo-->bar 2400[#/sec] bar 4000[#/sec] httpd.conf foo-->bar 2700[#/sec] bar 5500[#/sec]
Ces résultats me semblent assez logiques: la rewrite rule dans httpd.conf est un peu plus rapide que dans un .htaccess et l'accès direct à la page deux fois plus rapide dans les deux cas.
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

04 avr. 2006, 16:53

Oui, malheureusement cette RewriteRule est générée par PHP et risque d'être assez dynamique (probablement quotidienne, je ne sais pas encore) et j'ai un peu peur de modifier httpd.conf automatiquement. Enfin, je verrai bien... (il doit être possible d'utiliser Apache pour parser le httpd.conf modifié et ne remplacer l'original que si le nouveau est valide, pas encore réfléchi à ça ;))

Merci d'avoir testé sur ta machine, ça confirme mes doutes sur l'éventuel bug quelque part sous Windows (ou juste sur ma machine, qui sait?). Quelque part ça me rassure un peu, merci ;)

Mon thread chez Développez est toujours vide, apparament "qualité > quantité" est toujours TRUE :roll:

ViPHP
ViPHP | 1380 Messages

05 avr. 2006, 21:23

Oui, malheureusement cette RewriteRule est générée par PHP et risque d'être assez dynamique (probablement quotidienne, je ne sais pas encore) et j'ai un peu peur de modifier httpd.conf automatiquement. Enfin, je verrai bien... (il doit être possible d'utiliser Apache pour parser le httpd.conf modifié et ne remplacer l'original que si le nouveau est valide, pas encore réfléchi à ça ;))
Dans ton httpd.conf, tu peux toujours faire un include d'un fichier qui ne contiendra que tes rules. Celui-ci sera plus facile à parser et tu ne risques pas de modifier autre chose :wink:

Pour réactiver les nouvelles directives sans perturber les connexions existantes faire un graceful restart (Sous Linux - Je crains que le graceful ne soit pas possible sous windows).
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 avr. 2006, 21:37

Dans ton httpd.conf, tu peux toujours faire un include d'un fichier qui ne contiendra que tes rules
C'est une p***** d'idée de génie ça, je m'en veux de ne pas y avoir pensé :lol:
Comme ça je pourrais écraser le fichier include sans remords. D'un point de vue purement théorique ça permettrait à un admin qui possèderait plusieurs serveurs de placer l'include dans un dossier NFS. Resterait à faire redémarrer Apache sur chaque serveur un par un, mais ça permettrait de centraliser plus facilement la config.

Petit nouveau ! | 9 Messages

20 juin 2006, 20:03

Bonjour,

ayant lu un sujet à peu près similaire, j'ai fait une recherche et suis tombé (merci Google) sur cet excellent test et qui fini de me convaincre d'intégrer mes regles de réécriture dans le fichier de conf d'apache.

malheureusement, je n'y suis pas parvenu, je viens donc solliciter votre aide, afin de savoir ce qui ne va pas :)

La config:
Un dédié hébergé chez SIVIT (toiut comme PHPFrance ;-) )
PHP Version 4.3.10-2
Apache 1.3.33

.htaccess

Code : Tout sélectionner

ErrorDocument 404 /modules/erreurs/index.php?error=404 RedirectPermanent index.html http://www.domaine.tld/modules/news/ RedirectPermanent /modules/xgallery/ http://www.domaine.tld/modules/gallery/ RewriteCond %{HTTP_HOST} ^domaine.tld$ RewriteRule ^(.*) http://www.domaine.tld/$1 [QSA,L,R=301] RewriteEngine on #Menu RewriteRule ^forum.html$ modules/newbb/ [L]
Ci-dessus les premières lignes de mon .htaccess ... les regles fonctionnent bien entendu, toutefois à y regarder de
plus près, je ne suis pas sur que l'instruction "RewriteEngine on" soit à sa bonne place ... bref

Pour faire simple, j'ai inséré, une simple regle dans le virtualhost de httpd.conf, cela donne:

Code : Tout sélectionner

<VirtualHost 194.146.xxx.xxx> DocumentRoot /home/public_html/ ServerName www.domaine.tld ServerAlias *.[url=http://www.phpfrance.com/hebergement/click.php?id=3]sdxxx.sivit.org[/url] DirectoryIndex index.php index.html ServerAdmin [email protected] RewriteEngine on RewriteRule ^forum.html$ modules/newbb/ [L] </VirtualHost>
Je commente ma regle dans .htaccess, puis redemarre Apache ... nada, ça ne fonctionne pas.

qu'est-ce qui cloche d'après vous ?

merci de votre aide

Frederic

Petit nouveau ! | 9 Messages

22 juin 2006, 11:47

quelqu'un a une idée ? :)

ViPHP
ViPHP | 1380 Messages

22 juin 2006, 11:53

As-tu activé le rewrite.log?

Sinon, fais le et mets le en level 9 pour deboguer.

Code : Tout sélectionner

RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 9
ripat

Petit nouveau ! | 9 Messages

22 juin 2006, 15:58

ou doit il être activé ?

ViPHP
ViPHP | 1380 Messages

22 juin 2006, 16:03

Dans httpd.conf ou ce qui tient lieu de fichier de config du serveur Apache
ripat

Petit nouveau ! | 9 Messages

22 juin 2006, 16:31

ça va pas le faire, le log grossi de 5MB a chaque secondes !!

ViPHP
ViPHP | 1380 Messages

22 juin 2006, 17:14

Ton serveur est en production?

Si c'est le cas, diminue le level, fais tes essais de rewrite et remets level 0 (pas de log).

Tu auras alors le temps de vérifier les log à ton aise pour voir ce qui cloche.
ripat

Petit nouveau ! | 9 Messages

22 juin 2006, 17:45

oui le serveur est en prod, connais tu les différents niveau de log et ce qu'ils indiquent ?

sinon, les regles de réécritures ou le fichier de conf d'apache te semble correct ? ... c'est bizarre quand même non ?