2017-02-26 1 views
3

Mon site Web peut traiter simultanément plus de 40 000 personnes et fonctionner rapidement, mais un robot de moteur de recherche va tuer mysql. Cela m'a rendu fou parce qu'une fois que les robots arrivent, le site affichera "Impossible de se connecter: trop de connexions" et je dois redémarrer manuellement mysqld pour récupérer le site. Je m'attaque à cela depuis un an. J'ai fait tant d'ajustements à Apache et mysql tuning et rien ne semble fonctionner. J'ai changé le max_connections de 300 à 1800 à 10000 et cela ne règle pas le problème de bot. J'utilise Amazon Linux et j'ai une énorme instance/serveur. Ram n'est pas un problème. J'ai fait d'innombrables supports techniques et ils ne trouvent rien de mal JAMAIS. Je dois donc supposer que cela a quelque chose à voir avec ma programmation. Je n'utilise pas Wordpress, j'ai construit mon site à partir de zéro mais comme je l'ai dit, il peut gérer 40 000 personnes sans problème. Bots cependant, l'accident.Les robots détruisent mysql avec "trop ​​de connexions". Ce n'est PAS une augmentation du nombre de connexions max

mon script de connexion est simple:

$connect=mysql_connect("localhost","user","password"); 
if (!$connect) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("db",$connect); 

La chose étrange est, il y a toujours « 1 » pour les connexions actuelles, même s'il y a 2000 personnes sur le site. C'est pourquoi j'ai l'impression de faire quelque chose de mal avec la connexion à la base de données.

Est-ce que quelqu'un a de l'expérience ou des conseils pour faire fonctionner un site à tout moment avec un trafic de bot intense? S'IL VOUS PLAÎT!!! Je répète, ce n'est pas un problème d'augmentation max_connections.

+0

2 questions: 1) gardez-vous la connexion ouverte pour toute la session de l'utilisateur? ou est-il fermé et ouvert plus d'une fois par session? 2) quand vous avez 40K personnes - vous voulez dire SIMULTANÉMENT? et vous voyez toujours 1 connexion db ?! – carmel

+0

Je lance le script de connexion, puis après les requêtes de sélection je le ferme (même s'il se ferme de lui-même). Oui, je peux avoir 40k simultanément et il montrera 1 connexion dans la liste de processus ssh show. Et je sais que c'est étrange. C'est pourquoi j'ai l'impression de faire quelque chose de mal. Mais la base de données peut gérer toutes ces personnes bien! Juste pas bots et je suis tellement fatigué de cela !! –

+0

Vraisemblablement, les robots touchent votre site web, pas directement votre mysqld. Est-ce que quelque chose en particulier caractérise le trafic de votre bot? Pouvez-vous dire qu'il s'agit de robots provenant des chaînes de l'agent utilisateur, ou sinon, comment le dites-vous? Avez-vous essayé, lorsque vous avez détecté des bots, de répondre avec le statut 503 (surcharge temporaire)? Cela résout-il le problème? Avez-vous essayé de mettre à jour votre code de l'interface 'mysql_' notoirement non fiable et obsolète à' PDO' ou 'mysqli_'? –

Répondre

1

MySQL accepte de nouvelles connexions, mais ne peut pas gérer toutes les requêtes. Le nombre de connexions en attente s'accumulera, jusqu'à ce qu'il y en ait beaucoup.

Problème n'est pas vraiment avec MySQL, ce sont les robots qui se comportent mal. Vous n'avez probablement pas besoin que tous ces robots analysent votre site entier à chaque fois. Heureusement, vous avez un certain contrôle sur eux.

Étape 1: Créez un robots.txt et interdisez tous les robots, sauf ceux qui vous intéressent.

User-agent: google 
Disallow: 

User-agent: yahoo 
Disallow: 

User-agent: msn 
Disallow: 

User-agent: * 
Disallow:/

Étape 2: Créer un plan du site. Définir la dernière heure de chaque page signifie que les robots ne toucheront que les pages modifiées de votre site. Vous pouvez créer un sitemap de manière dynamique (en interrogeant votre base de données) à l'aide de la bibliothèque PHP: thepixeldeveloper/sitemap.

Dans l'exemple, nous supposons que vous avez une base de données avec une table pages. La table contient une colonne permalink et last_modified.

// sitemap.php 

$urlSet = new Thepixeldeveloper\Sitemap\Urlset(); 

// Adding the URL for '/' to the XML map 
$homeUrl = (new Thepixeldeveloper\Sitemap\Url('/')) 
    ->setChangeFreq('daily') 
    ->setPriority(1.0); 

$urlSet->addUrl($homeUrl); 

// Add URL of each page to sitemap 
$result = mysql_query("SELECT permalink, last_modified FROM pages"); 

while ($page = mysql_fetch_asoc($result)) { 
    $url = (new Thepixeldeveloper\Sitemap\Url($page['permalink'])) 
     ->setLastMod($page['last_modified']) 
     ->setChangeFreq('monthly') 
     ->setPriority(0.5); 

    $urlSet->addUrl($url); 
} 

header('Content-Type: text/plain'); 
echo (new Thepixeldeveloper\Sitemap\Output())->getOutput($sitemapIndex); 

Vous pouvez utiliser une règle de réécriture dans Apache (ou similaire dans un autre serveur HTTP) pour réécrire sitemap.xml à sitemap.php. Ceci devrait être suffisant, bien qu'il puisse y avoir des bots qui ne respectent pas robots.txt. Détecter et de les bloquer (par IP et/ou agent utilisateur) dans la configuration du serveur HTTP


Voir également les éléments suivants:

connexions Max sont là, de sorte que votre serveur ne surcharge pas. Vous devez effectuer un test d'évaluation pour déterminer le nombre maximal de requêtes parallèles que votre application peut gérer.Réduisez ce nombre de 20% et définissez-le comme maximum dans votre serveur Web HTTP et votre configuration MySQL.

Cela signifie que votre serveur donnera une réponse 503 Service Unavailable avant qu'il ne soit surchargé. Cela fera (bien se comporter) les robots abandonner et réessayer plus tard, ce qui signifie que votre système va restaurer sans attention manuelle.

Votre script doit également quitter avec la bonne réponse HTTP.

$connect = mysql_connect("localhost", "user", "password"); 
if (!$connect) { 
    header("HTTP/1.1 503 Service Unavailable"); 
    echo 'Could not connect: ' . mysql_error(); 
    exit(); 
} 
mysql_select_db("db", $connect); 
+0

Merci beaucoup. Je vais essayer de mettre en œuvre tout cela et voir comment ça se passe aujourd'hui. –

+0

Je ne vais pas mentir, je sais que le générateur de sitemap sera une aide énorme pour réduire les bots rampant les mêmes pages encore et encore, mais je ne comprends pas le paquet que vous avez envoyé. Je ne vois pas où je saisis les informations dans ma base de données, etc. –

+0

@ChrisFilippou Je suppose que vos pages ne sont pas statiques, mais proviennent d'une base de données. Vous interrogez votre base de données pour créer le sitemap, vous n'écrivez rien dans la base de données. Je ne sais pas à quoi ressemble votre base de données, mais je vais ajouter quelque chose à la réponse. –