机器人用“太多连接”来杀死mysql。这不是增加最大连接问题

时间:2017-02-26 19:26:05

标签: php mysql database

我的网站可以同时处理40,000人或更多人并且运行速度很快但搜索引擎机器人会杀死mysql。它一直让我疯狂,因为一旦机器人来了,该网站将显示“无法连接:太多连接”,我必须手动重启mysqld以恢复网站。我一直在处理这个问题。我已经对apache和mysql调优做了很多调整,似乎没有任何工作。我已将max_connections从300更改为1800到10000,这不能解决机器人问题。

我使用的是亚马逊linux并拥有庞大的实例/服务器。拉姆不是问题。我已经完成了无数的技术支持,他们发现没有任何错误。所以我必须假设它与我的编程有关。我不使用Wordpress,我从头开始构建我的网站,但就像我说它可以处理40,000人没问题。然而机器人崩溃了。

我的连接脚本很简单:

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

奇怪的是,即使网站上有2000人,当前连接也始终为“1”。所以这就是为什么我觉得我在连接数据库时做错了。

是否有人在使用大量机器人流量时始终保持网站运行的经验或建议?请!!!我再说一遍,这不是增加max_connections问题。

1 个答案:

答案 0 :(得分:1)

MySQL正在接受新连接,但无法处理所有查询。等待连接的数量会累积,直到有很多。

问题与MySQL无关,它是机器人行为不端的问题。您可能不需要每次都扫描整个网站的所有机器人。幸运的是,你可以控制它们。

第1步:创建robots.txt并禁止所有机器人,但您关注的机器人除外。

User-agent: google
Disallow:

User-agent: yahoo
Disallow:

User-agent: msn
Disallow:

User-agent: *
Disallow: /

第2步:创建站点地图。设置每个页面的上次修改时间,意味着机器人只会点击您网站上已更改的页面。您可以使用PHP库动态创建站点地图(查询数据库):thepixeldeveloper/sitemap

我的例子中,我们假设你有一个带有pages表的数据库。该表格包含permalinklast_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);

您可以在Apache(或其他HTTP服务器中的类似服务器)中使用重写规则将sitemap.xml重写为sitemap.php

RewriteEngine On
RewriteRule sitemap.xml sitemap.php [L]

这应该足够,但可能有机器人不尊重robots.txt。检测它们并在HTTP服务器配置中阻止它们(通过IP和/或用户代理)

还要考虑以下事项:

最大连接在那里,因此您的服务器不会过载。您应该进行基准测试,以确定应用程序可以处理的最大并行请求数。将该数量减少20%,并在HTTP Web服务器和MySQL配置中将其设置为最大值。

这意味着您的服务器会在超载前提供良好的503 Service Unavailable响应。这将使(表现良好)机器人放弃并稍后再试,这意味着您的系统将在没有人工关注的情况下恢复。

您的脚本也应该使用正确的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);