Répartir la charge

  • Auteur de la discussion Auteur de la discussion Nitou
  • Date de début Date de début
WRInaute impliqué
Bonjour ;)

J'ai une petite question !

Voulant faire du load balancing, conscistant à répartir la charge entre plusieurs serveurs j'ai créer www2 en sus de www, j'ai un script php qui évalue la charge du serveur www et qui selon le chiffre donné ou le nombre de hit durant une certaine durée, redirige les visiteurs étant sur www vers www2, j'ai peur que google visite www2 et me pénalise pour duplicate content, c'est pourquoi j'amerais savoir ce que vous feriez pour éviter que google aille sur www2 ?

Le site : www.infos-du-net.com

Merci @ vous :wink:
 
Nouveau WRInaute
2 possibilités :

Insérer un tag META sur le fichier index de www2:
Code:
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">

Créer un fichier robots.txt a la racine du www2 pour interdire a google et autres de l'indexer
Code:
User-agent: *
Disallow: /
 
WRInaute occasionnel
Dans ton script de redirection tu peux aussi faire une liste de user_agent ou d'ip à envoyé automatiquement sur le www
 
WRInaute discret
Bonjour,

ce n'est pas tellement en PHP que tu dois gérer ça, mais en amont.

Tu peux déjà le faire au niveau du DNS en définicant un "tourniquet" ( round-robin ) qui va alternativement donner l'IP d'un serveur ou de l'autre. Mais les deux répondrons toujours au même nom de domaine.

Ainsi, tu ne te poses plus la question des moteurs de recherche et le PHP devient inutile (surtout que lui doit aussi venir charger ta machine).

D'autres solutions existent ensuite mais sont plus lourdes à mettre en place, ou sur serveur IIS :
- load balancing matériel : c'est un boitier qui "s'occupe" de tout
- load balacing soft avec IIS ( uniquement sur la version advanced server de Windows 2000 )
- autres solutions soft

Voila, donc le round-robin sur le DNS me semble le plus approprié.

A++
 
WRInaute impliqué
J'aimerai désactivé le script de load balancing s'il y a googlebot, mais je ne trouve pas la soluce :(

J'ai essayé ça :

if (strpos($_SERVER["REMOTE_HOST"], "googlebot.com") != true){
include("script.php");
}

Quelqu'un a la solution ? :roll:
 
WRInaute impliqué
Merci, Richard, j'ai le même besoin que Nitou, donc tu as répondu aussi à une question que je n'ai pas eu besoin de poser :lol: :lol:

Question complémentaire de béotien sur les serveurs de DNS : comment tu paramètres un "tourniquet" dans la pratique sur le serveur de DNS ?
 
WRInaute discret
Bonjour Cariboo, bien content d'avoir fait d'une pierre deux coup :)

Pour paramétrer le DNS, ca dépend essentiellement du DNS. Sur linux, il y a de forte chance que ce soit BIND. Dans ce cas, ce sera certainement dans le fichier de la zone qu'il faudra donner plusieurs adresse au même HOST Pour la suite en revanche, je ne suis pas trés familier avec BIND, je te renvois donc vers la documentation de BIND...

En ce qui concernant le DNS Windows 2000, c'est un simple case à cocher après avoir défini toutes les IPs possibles pour le HOST.
Gestion DNS -> propriétés du serveur -> Avancées -> Activer le Round Robin ( c'est la traduction de la version US, donc pas forcément exacte par rapport à une version FR ).

Je crois que c'est par ailleur une configuration par défaut sur W2K. Peut-être que quelqu'un pourrait nous dire si c'est aussi par défaut sur BIND ?


Pour NITOU:

tu ne testes pas la bonne variable serveur... C'est le useragent qu'il faut tester:
$_SERVER["HTTP_USER_AGENT"]
 
WRInaute impliqué
Richard a dit:
Pour NITOU:

tu ne testes pas la bonne variable serveur... C'est le useragent qu'il faut tester:
$_SERVER["HTTP_USER_AGENT"]

Je test par rapport à l'host donc googlebot.com, cela devrait également fonctionner ?
 
WRInaute impliqué
Nitou a dit:
J'aimerai désactivé le script de load balancing s'il y a googlebot, mais je ne trouve pas la soluce :(

J'ai essayé ça :

if (strpos($_SERVER["REMOTE_HOST"], "googlebot.com") != true){
include("script.php");
}

Quelqu'un a la solution ? :roll:

J'ai essayé un tas de manipulation mais je n'y parviens pas, pourtant ça ne doit pas être bien dur :oops: :cry: :cry: :cry:
 
WRInaute impliqué
J'ai regardé googlestats et je suis parvenu à ça :

if ($_SERVER["HTTP_USER_AGENT"] == "Googlebot")
{
echo("");
} else {
include("script.php");
}

Pouvez-vous me dire si vous observez une erreur ?

Merci beaucoup :oops:
 
WRInaute discret
a quoi sert le echo "" ?

si la chaine n'est pas exactement egale tu devrais utiliser une comparaison, p.ex:

Code:
if eregi("googlebot", $_SERVER["HTTP_USER_AGENT"] ) 
{ 
include("script.php"); 
}

Ben
 
WRInaute impliqué
Dites quelqu'un aurait la solution à ce probleme :

Je m'explique, pour avoir l'utime du serveur, le script s'execute ainsi :

Code:
    $buffer = `utime`
    ereg("averages: ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]*)", $buffer, $load);
    return max((float)$load[2], (float)$load[3], (float)$load[4]);

Cependant j'ai un gros probleme, PHP interdit les backquotes "`utime`" par contre perl qui utilise la meme commande, lui l'autorise donc j'ai essayer un truc de ce genre :

Code:
    $buffer = readfile('/home/path/uptime.pl');
    ereg("averages: ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]*)", $buffer, $load);
    return max((float)$load[2], (float)$load[3], (float)$load[4]);

Uptime.pl lui donne ça : 5:55PM up 9 days, 5:01, 0 users, load averages: 1.37, 1.21, 1.10

Si je remplace $buffer = readfile('/home/path/uptime.pl'); par $buffer = "5:55PM up 9 days, 5:01, 0 users, load averages: 1.37, 1.21, 1.10"; le script fonctionne correctement, donc j'en déduis que le buffer n'arrive pas à récupérer la variable de uptime.pl, je pense que c'est mon code qui n'est pas bon, Quelqu'un aurait une idée ?

uptime.pl lui ne sort rien d'autre qu'une ligne quand on l'éxécute à savoir : "5:55PM up 9 days, 5:01, 0 users, load averages: 1.37, 1.21, 1.10"

Merci de votre aide :(
 
WRInaute occasionnel
Je n'ai pas testé le script de répartition de charge en perl auquel je faisais référence, donc je ne peux rien en dire d'autre.

Pour le PHP, quelques idées :
- PHP n'interdit les backquotes, mais le "safemode" de PHP, s'il est activé, les interdit
- la fonction utime() (ou un équivalent) n'existe pas (ou j'ai mal cherché)
- la fonction readfile est interdite par le "safe mode"
- la fonction readfile renvoie un code d'erreur qui permet de savoir si elle s'est correctement exécutée
- si le fichier '/home/path/uptime.pl' n'est pas dans DOCUMENT_ROOT ni dans include_path, ça ne fonctionnera pas
- on peut utiliser fread pour obtenir le même résultat
- au besoin, modifier la valeur de error_reporting et de 'display_errors' grâce à ini_set

Voila, pas d'autres suggestions. :wink:

Jocelyn
 
WRInaute impliqué
Jocelyn a dit:
Je n'ai pas testé le script de répartition de charge en perl auquel je faisais référence, donc je ne peux rien en dire d'autre.

Pour le PHP, quelques idées :
- PHP n'interdit les backquotes, mais le "safemode" de PHP, s'il est activé, les interdit
- la fonction utime() (ou un équivalent) n'existe pas (ou j'ai mal cherché)
- la fonction readfile est interdite par le "safe mode"
- la fonction readfile renvoie un code d'erreur qui permet de savoir si elle s'est correctement exécutée
- si le fichier '/home/path/uptime.pl' n'est pas dans DOCUMENT_ROOT ni dans include_path, ça ne fonctionnera pas
- on peut utiliser fread pour obtenir le même résultat
- au besoin, modifier la valeur de error_reporting et de 'display_errors' grâce à ini_set

Voila, pas d'autres suggestions. :wink:

Jocelyn

Merci Jocelyn :wink:

Le probleme c'est que pour qu'il récupère ce qu'il y a dans uptime.pl il faut qu'il l'execute pour qu'il soit lu par PERL car si je lui donne le DOCUMENT_ROOT il va lire ce qu'il y a dans le fichier uptime.pl mais il me donnera pas l'Uptime du serveur car il ne sera pas interprété, ce que je cherche c'est comment ouvrir avec une URL du genre http://www.site.com/uptime.pl

donc si j'ouvre l'url avec un readfile par exemple, il charge bien la page mais il ne garde pas l'uptime (5:55PM up 9 days, 5:01, 0 users, load averages: 1.37, 1.21, 1.10) pour le donner au buffer :((

Si quelqu'un sait, merci d'avance :)
 
WRInaute impliqué
Finalement j'ai réussi grâce à toi :)

Merci beaucoup

J'ai fais ça en fait :

Code:
    $filename = "http://www.site.com/dossier/uptime.pl";
    $fd = fopen($filename, "r");
   $buffer = fread($fd, filesize ($filename));
    ereg("load averages: ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]), ([0-9][.][0-9][0-9]*)", $buffer, $load);
    return max((float)$load[2], (float)$load[3], (float)$load[4]);
    fclose($fd);

Si tu penses que ça peut etre optimisé, dis le stp :)

Encore merci
 
WRInaute occasionnel
Bon, tant mieux , ma liste de suggestions a servi à quelque chose. C'était quoi ? problème de "safe mode" ?

Oui, je propose une optimisation de l'expression régulière :
Code:
ereg("load averages: ([0-9]\.[0-9]{2})(, ([0-9]\.[0-9]{2})){2}", $buffer, $load);
devrait fonctionner aussi avec les exemples que tu as précédemment donnés.

{n} -> exactement n fois ce qu'il y a dans le groupe de parenthèses qui précède.

Remarque : tu devras faire des essais pour savoir quels sont les éléments du tableau $load qui t'intéressent.

Jocelyn
 
WRInaute impliqué
Jocelyn a dit:
Bon, tant mieux , ma liste de suggestions a servi à quelque chose. C'était quoi ? problème de "safe mode" ?

Oui, je propose une optimisation de l'expression régulière :
Code:
ereg("load averages: ([0-9]\.[0-9]{2})(, ([0-9]\.[0-9]{2})){2}", $buffer, $load);
devrait fonctionner aussi avec les exemples que tu as précédemment donnés.

{n} -> exactement n fois ce qu'il y a dans le groupe de parenthèses qui précède.

Remarque : tu devras faire des essais pour savoir quels sont les éléments du tableau $load qui t'intéressent.

Jocelyn

Le probleme est effectivement lié au safemode, du moins je pense mais la fonction readfile fonctionne :?: :?:

Merci pour tes suggestions :)
 
WRInaute discret
salut,

je fais remonter ce sujet car j'ai testé le système round-robin mais ça ne semble pas marcher.

Tout le monde arrive à chaque fois sur le meme serveur.

J'ai mis ceci dans mon fichier d'enregistrement

Code:
$ttl 86400
internetservices-fr.com.        IN      SOA     ns1.i-services.net. webmaster.i-services.net. (
                        2003011604
                        21600
                        3600
                        604800
                        86400 )
internetservices-fr.com.        IN      NS      ns1.i-services.net.
                IN      NS      ns.ovh.net.
                IN      MX      10 mail.internetservices-fr.com.
                IN      A       213.186.39.149
www0            IN      A       213.186.39.149
www1            IN      A       213.186.39.207
mail            IN      A       213.186.39.149
smtp            IN      A       213.186.39.149
sql             IN      A       213.186.39.207
dev             IN      A       213.186.39.207
www             IN      CNAME   www0.internetservices-fr.com.
                IN      CNAME   www1.internetservices-fr.com.

et si je fais une requete avec dig j'obtiens un message d'erreur

Code:
[root@ns1 root]# dig www.internetservices-fr.com @ns1.i-services.net

; <<>> DiG 9.2.3 <<>> www.internetservices-fr.com @ns1.i-services.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 42762
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.internetservices-fr.com.   IN      A

;; Query time: 1 msec
;; SERVER: 213.186.39.149#53(ns1.i-services.net)
;; WHEN: Mon Dec 15 19:51:45 2003
;; MSG SIZE  rcvd: 45

alors que si je retire les lignes avec le cname j'ai une section "answer" et le statut "noerror"

ou me suis-je trompé ??

merci

Olivier
 
Discussions similaires
Haut