Problème de htaccess et de CPU serveur

O
ouiffi
Guest
Bonjour,
Je me suis rendu compte ce matin que le CPU très élevé de mon serveur s'expliquait par le htaccess d'un de mes sites...
J'ai plusieurs questions :

1. l'un d'entre vous peut-il m'indiquer comment optimiser ce dernier? http://www.assosports.com/htaccess.html
2. est-il préférable de mettre mes règles dans le fichier de conf du site ou bien cela n'aura aucun impact (mes tests me poussent à croire que non) ?
Pour comprendre mes règles, les 2 premiers paramètres comprennent systématiquement :
- le libelle du club
- la saison
(il s'agit d'un site associatif)
3. un rewrite map serait il préférable pour ces infos ? (mon expérience professionnelle me pousse à croire que ça ne changerait pas grand chose)

Merci d'avance pour votre aide.
La situation devient critique pour mes sites..

Cordialement,
Julien
 
WRInaute accro
Effectivement, tu as une liste un peu longuette...

Tu peux regrouper une bonne partie de tes rewriterules qui ont une structure similaire. Par exemple:
Code:
RewriteRule ^(.*)/(.*)/buteur/([0-9]*)/$ club/php/buteur/index.php?IdJoueur=$3&currentclub=$1&currentsaison=$2 [QSA,L] 
RewriteRule ^(.*)/(.*)/passe/([0-9]*)/$ club/php/passe/index.php?IdJoueur=$3&currentclub=$1&currentsaison=$2 [QSA,L] 
RewriteRule ^(.*)/(.*)/carton/([0-9]*)/$ club/php/carton/index.php?IdJoueur=$3&currentclub=$1&currentsaison=$2 [QSA,L]

peut être remplacé par:
Code:
RewriteRule ^(.*)/(.*)/(buteur|passe|carton)/([0-9]*)/$ club/php/$3/index.php?IdJoueur=$4&currentclub=$1&currentsaison=$2 [QSA,L]

Avec ça tu devrais pouvoir réduire assez considérablement le nombre de rewriterules.

De la même façon, tu as souvent plusieurs rewriterules pour des légères variation de syntaxe, par exemple sur les "coachator". Au lieu de faire le tri à ce niveau là, utilise une seule regex qui renvoie toute la fin au script, et laisse le script trouver le bon cas de figure. Même en utilisant 6 regex dans le code php, ces 6 regex ne seront vérifiées que si tu es dans le cas coachator (et en plus elles seront probablement plus "simples" et donc plus rapides à exécuter), alors que là les 6 regex sont évaluées pour chaque requête. Avec un explode plutôt que des regex tu dois pouvoir aussi optimiser un peu.

Une autre possibilité pourrait être de tout renvoyer (avec une seule rewriterule, quoi) sur un script php unique qui va pouvoir faire un petit explode sur l'URL et appliquer des règles probablement plus simples et rapides à tester que tout un tas de regexp. Avec un bon hash (pardon, tableau associatif) et des pointeurs de fonctions (je ne sais pas comment ça s'appelle en php) ça doit pouvoir aller nettement plus vite.

Jacques.
 
O
ouiffi
Guest
Bonjour,
Merci pour votre retour.
Effectivement je vais essayer d'alléger tout ça.
Pensez-vous que ceci seul puisse être à l'origine de mon 95% CPU ?
Pensez-vous qu'un rewritemap m'aiderait dans ce cas?
Pensez-vous que cela soit mieux de supprimer mon htaccess et de tout mettre dans le fichier de conf?
Julien
 
WRInaute accro
C'est clair que ça doit bouffer du CPU, après c'est difficile de dire s'il n'y a que ça, ça dépend beaucoup de tes scripts php, de tes requêtes sql, de ta config, etc. Un petit top pourrait déjà donner une petite idée.

Une autre optimisation possible: mettre en premier les règles qui correspondent aux pages les plus fréquemment consultées (en tenant compte des priorités pour les règles qui en ont besoin): si 90% des requêtes correspondent à la dernière rewriterule, apache va devoir vérifier toutes les rewriterules une par une pour chaque requête, alors que si 90% des requêtes correspondent à la première rewriterule, il pourra s'arrêter là, puisqu'il y a un [L] à chaque fois.

Le rewritemap je ne sais pas trop comment tu l'utiliserais dans le cas présent (à moins que tu aies des choses genre /toto/ -> turlututu, /tata/ -> tsointsoin plutôt que /toto/ -> toto, /tata/ -> tata).

Je ne sais pas si Apache met en cache d'une façon ou d'une autre les .htaccess. Si ce n'est pas le cas (ce qui est fort possible), le mettre dans le fichier de conf pourrait te faire gagner du CPU (pas besoin pour Apache de lire et interpréter ce très long fichier à chaque fois).

Jacques.
 
O
ouiffi
Guest
Une autre optimisation possible: mettre en premier les règles qui correspondent aux pages les plus fréquemment consultées (en tenant compte des priorités pour les règles qui en ont besoin): si 90% des requêtes correspondent à la dernière rewriterule, apache va devoir vérifier toutes les rewriterules une par une pour chaque requête, alors que si 90% des requêtes correspondent à la première rewriterule, il pourra s'arrêter là, puisqu'il y a un [L] à chaque fois.

Je n'arrive effectivement pas à inverser mes regles pour mettre au tout début les 3 dernières règles
Code:
RewriteRule ^([a-z]*)/([0-9]{4}[a-z]{1})/(.*)/$ club/php/$3/index.php?currentclub=$1&currentsaison=$2 [QSA,L]
RewriteRule ^([a-z]*)/([0-9]{4}[a-z]{1})/$ club/index.php?currentclub=$1&currentsaison=$2 [QSA,L]
RewriteRule ^([a-z]*)/$ /club/index.php?currentclub=$1 [QSA,L
Puis les règles "clients", puis les règles "admin"

Concernant le rewritemap, pour mon 1er champ, c'est un libellé texte que je vais chercher en base après. Ca mepermettrait d'avoir directement l'id...

Concernant le "top"n il ne m'indique pas grand chose en fait... Une load à 10 (des fois 30) mais en début de semaine j'étais à 50 minimum donc ça va... Y a plein de ligne "daemon" mais je n'arrive pas à expliquer leur origine, je ne m'y connais pas vraiment en système...

Julien
 
WRInaute accro
Si ces règles peuvent "matcher" des URLs qui doivent être prises en compte par d'autre regexps, tu est effectivement obligé de les laisser à la fin (ou en tous cas après toutes les autres regexps qui peuvent entrer en conflit). Comme je ne connais pas le format de tous les champs que tu matches avec des .* par ailleurs, difficile pour moi de t'en dire plus.

Par contre je pense que tu dois pouvoir mettre la plupart des règles admin beaucoup plus loin, non? Tu y gagnerais probablement pas mal.

Le rewritemap ne ferait que déplacer ce que tu as dans ton code PHP, non? Pas grand intérêt...

Et pour le top, si tu nous le copiais-collais on pourrait probablement t'en dire plus. Note que 10 de load average c'est déjà beaucoup, à moins que tu ais une tripotée de cores dans ton serveur :) normalement ça veut dire que ton CPU est déjà saturé en permanence.

Jacques.
 
O
ouiffi
Guest
Ok pour le rewritemap.

Pour le format, j'ai un libelle "tout type de texte az-_ "
et une chaine du format 2010s (année + 1 lettre)
j'ai mis ça dans mon htaccess : RewriteRule ^(.*)/([0-9]{4}[a-z]{1})/

j'ai activé le debug des logs, et j'ai plein d'erreurs en permanence, dont je ne connais pas l'origine....
Code:
[Thu Feb 11 16:53:57 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont
[Thu Feb 11 16:53:59 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont
[Thu Feb 11 16:54:01 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont
[Thu Feb 11 16:54:01 2010] [error] [client 66.249.65.60] File does not exist: /data/inetpub/wwwroot/assosports/club/php/joueurs
[Thu Feb 11 16:54:02 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont
[Thu Feb 11 16:54:04 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont
[Thu Feb 11 16:54:06 2010] [error] [client 87.118.122.12] File does not exist: /data/inetpub/wwwroot/assosports/usmontgermont


et pour le top, voici (c'est pas top du tout là) :

top - 16:55:03 up 22 min, 1 user, load average: 72.07, 61.53, 36.86
Code:
Tasks: 183 total,  59 running, 124 sleeping,   0 stopped,   0 zombie
Cpu(s): 95.0%us,  4.6%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   1018244k total,   986132k used,    32112k free,    12864k buffers
Swap:  1044216k total,   582920k used,   461296k free,    35540k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3015 daemon    15   0 23068 6816 2508 S  4.6  0.7   0:00.73 httpd
 2256 daemon    25   0 45692  13m 2644 R  3.3  1.3   0:25.30 httpd
 2258 daemon    25   0 62596  21m 2492 R  3.3  2.1   0:37.09 httpd
 2265 daemon    24   0 64036  10m 2504 R  3.3  1.0   0:37.29 httpd
 
O
ouiffi
Guest
Bonjour,
J'ai trouvé quelquechose de pas normal qui ressemble à une boucle (infinie je ne pense pas).
Il y a très souvent (1/sec) des requpêtes avec en paramètres plein de fois le même paramètre. Comment l'expliquez selon vous? Je ne vois pas pour ma part... Le souci peut venir de là je pense.

Code:
82.236.141.76 - - [11/Feb/2010:17:51:35 +0100] "GET /club/php/individu/index.php?IdIndividu=71&currentclub=assafoot&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008v&currentsaison=2008j HTTP/1.0" 200 19499 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)"
81.52.143.15 - - [11/Feb/2010:17:51:36 +0100] "GET /sclerheufoot/2007j/article-detail-5883-/ HTTP/1.1" 302 - "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
82.236.141.76 - - [11/Feb/2010:17:51:38 +0100] "GET /club/include/img/pictos/modifier.gif HTTP/1.0" 200 1039 "http://www.sclerheufoot.com/club/php/individu/index.php?IdIndividu=71&currentclub=assafoot&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008v&currentsaison=2008j" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)"
82.236.141.76 - - [11/Feb/2010:17:51:38 +0100] "GET /club/include/img/pictos/supprimer.gif HTTP/1.0" 200 1060 "http://www.sclerheufoot.com/club/php/individu/index.php?IdIndividu=71&currentclub=assafoot&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008v&currentsaison=2008j" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)"
82.236.141.76 - - [11/Feb/2010:17:51:38 +0100] "GET /club/protect/individus/assa.jpg HTTP/1.0" 200 2496 "http://www.sclerheufoot.com/club/php/individu/index.php?IdIndividu=71&currentclub=assafoot&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008v&currentsaison=2008j" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)"
81.52.143.34 - - [11/Feb/2010:17:51:39 +0100] "GET /usgosnefoot/2005v/individu/736736-k%e9vin+lemouland/ HTTP/1.1" 200 16381 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
81.52.143.36 - - [11/Feb/2010:17:51:41 +0100] "GET /club/php/article/index.php?IdCategorie=3&currentclub=sclerheufoot&currentsaison=2005s&currentsaison=2005s&currentsaison=2005j HTTP/1.1" 200 25223 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
90.54.23.229 - - [11/Feb/2010:17:51:41 +0100] "GET /avparce/2009s/charte/ HTTP/1.1" 200 44791 "http://www.assosports.com/avparce/2009s/classement/championnat/senior/general/1807/18120/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Orange 8.0; NaviWoo2.0; .NET CLR 1.1.4322)"
67.195.111.254 - - [11/Feb/2010:17:51:43 +0100] "GET /assafoot/2009s/article-detail-10587-samedi+d%C3%A9cembre/ HTTP/1.0" 200 35303 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"
81.52.143.36 - - [11/Feb/2010:17:51:44 +0100] "GET /club/php/article/index.php?Mode=detail&IdArticle=1490&currentclub=usgosnefoot&currentsaison=2005s&currentsaison=2005v&currentsaison=2005s&currentsaison=2005s HTTP/1.1" 302 - "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
81.52.143.36 - - [11/Feb/2010:17:51:47 +0100] "GET /usgosnefoot/2008v/entrainement/ HTTP/1.1" 200 16056 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
66.249.65.13 - - [11/Feb/2010:17:51:49 +0100] "GET /usgosnefoot/2006s/ HTTP/1.1" 200 26030 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html)"
193.252.149.13 - - [11/Feb/2010:17:51:49 +0100] "GET /fcsb/2008s/individu/3285-fabien-barbotin/ HTTP/1.1" 200 88 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
193.252.149.15 - - [11/Feb/2010:17:51:51 +0100] "GET /club/php/equipe/index.php?IdEquipe=13454&currentclub=melessejabc&currentsaison=2008s&currentsaison=2008j HTTP/1.1" 200 16185 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
81.52.143.37 - - [11/Feb/2010:17:51:51 +0100] "GET /sclerheufoot/2008s/joueur/8950/ HTTP/1.1" 200 22480 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)"
67.218.116.133 - - [11/Feb/2010:17:51:50 +0100] "GET /club/index.php?currentclub=asmrcourseapied&currentsaison=2008s&currentsaison=2008v&currentsaison=2008j&currentsaison=2008v&currentsaison=2008v&currentsaison=2008j&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008s&currentsaison=2008s&currentsaison=2008s&currentsaison=2008s&currentsaison=2008j&currentsaison=2008j&currentsaison=2008v&currentsaison=2008v&currentsaison=2008s&currentsaison=2008j&currentsaison=2008v&currentsaison=2008v&currentsaison=2008j&currentsaison=2008s&currentsaison=2008j&currentsaison=2008s&currentsaison=2008v HTTP/1.1" 200 27293 "-" "Mozilla/5.0 (Twiceler-0.9 http://www.cuil.com/twiceler/robot.html)"
 
Discussions similaires
Haut