我的网站可以同时处理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问题。
答案 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
表的数据库。该表格包含permalink
和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);
您可以在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);