如何查找和解决Bluehost虚拟主机CPU超时限制问题<原创>

近两天发现Bluehost虚拟主机上的这个帐户有CPU超时限制问题,查了一下第三方的统计PV平均数值还不到1万,没有理由出现这样的问题,我的另一个帐户在同样的流量下没有任何问题。
查看CPU Exceeded Log信息提示为MySQL查询超时。
可能造成Bluehost虚拟主机CPU超时限制的原因大致如下:
1.MySQL数据库文件碎片过多,解决方法整理数据库。
2.过多的搜索引擎蜘蛛大量提交数据库查询请求、被不良采集、恶意访问等,解决方法屏蔽!
3.网站源码、脚本效率低或配置不佳,我的这个帐户因良好运行已久,不存在这个问题,排除这种可能。
Bluehost虚拟主机出现CPU超时限制,不是一个严重问题,经过5、6分钟就会自动恢复正常,不用担心。
第一步要做的是找到原因:
如果能够直接找到引起CPU超时限制的那个问题最好不过了,因为Bluehost虚拟主机可以多个网站同时运行于一个帐户,有其复杂性。
如果不能确认是一个问题引发,可以圈定几个因素,逐一排查。
第二步要做的是解决问题:
上面以及提到了,解决方法相当简单,无非是屏蔽不良访问源、修改源码和整理MySQL数据库(单个500M以下的MySQL数据库产生文件碎片从而引起超时的可能性很小,基本可以不考虑。)。
很显然难点不是如何解决问题,找到引起CPU超时的原因才是关键。
(继续)
打开bluehost虚拟主机的“/tmp/cpu_exceeded_logs”目录,这里保存着发生CPU exceeded时的日志记录文件。在这里我们可以找到我们需要的信息,
包括: 在发生超时的那一分钟内究竟有哪些进程访问
具体的访问时间
访问了本帐户内的哪些网站
但这些信息似乎还不能帮助我们找到一些特殊的问题,例如:恶意访问者使用的IP。幸好bluehost为我们准备好了一切,我们可以去查访问日志(*我们通常用的第三方统计,通常无法看到蜘蛛的访问记录,但在Bluehost虚拟主机的日志上可以看到)
用文本编辑器打开2008-07-23.log文件,在很多记录数据中出现一条有问题的数据,可以看出下面一条用时很短是正确的但used 93.00 seconds of cpu time for [[mysql query]]就不正常了。 Thu Jul 23 10:46:50 2008: used 93.00 seconds of cpu time for [[mysql query]]
Thu Jul 23 10:46:50 2008: used 0.10 seconds of cpu time for /ramdisk/bin/fcgiphp5
在这个2008-07-23.log文件中得到了如下信息
1.超时发生在“Thu Jul 23 10:46:50 2008”
2.超时的过程中有哪些网站被访问(*2008-07-23.log中有详细记录,我在这里没有列出)
现在登陆cPanel-->log,进一步查看详细的访问记录
这里有3项日志可供我们分析:
1.最近的访客,这里记录的内容是最近的访问。
2.原始的访问日志,这里是完全的访问记录。
3.Awstats或Weblizer两种图形化的访问统计,您启用了哪个就查看哪一个。
进入“最近的访客”,选择出问题时曾被访问的网站,查找10:46这个时间,很快发现一个IP段的连续密集访问,基本可以断定是这个IP段的疯狂提交请求造成cpu exceeded。
再进入Awstats看一下直观的统计。
在Awstats有一个非常好用的统计项是:Hosts-top25这里给出了访问量最大25个来访IP。见下图:
bluehost_cpu_exceeded

IP涉及:
58.61.164.207
58.61.164.40
58.61.164.39
58.61.164.41
58.61.164.42
58.61.164.139
分析到这里可以基本断定故障是因为上述IP地址下的主机近似攻击式的访问造成了我们网站cpu exceeded,这里会产生一个疑问,它们会不会是有用的搜索引擎蜘蛛?
通常正常的搜索引擎的蜘蛛不会出现在Hosts-top25这一项目里,蜘蛛会显示在Connect to site from 这一项目中。说明上述IP为恶意访问或垃圾蜘蛛。
我们再进一步证实一下
正常的蜘蛛在原始日志是这样显示的,可以看到这是Google的 Googlebot,在提交时署名为Googlebot,任何正规的搜索引擎都是同样的,特点是必须包含一个署名。
66.249.70.197 - - [28/Jul/2008:03:40:48 -0600] "GET /xxxx.html HTTP/1.1" 200 17366 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
再来对比下这个
58.61.164.207 - - [22/Jul/2008:03:40:00 -0600] "GET /xxxx.html HTTP/1.1" 200 822 "/xxxx.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
好了,到这里我们可以把这些访问判断为恶意访问或垃圾蜘蛛爬行,处理就很简单了,屏蔽这些IP,而我是直接屏蔽了这个IP段。
方法:在.htaccess文件中加入下面的命令:
1.逐一屏蔽IP
# 恶意访问IP 58.61.164.X
< Files 403.shtml>
order allow,deny
allow from all
< /Files>
deny from 58.61.164.207
deny from 58.61.164.39
deny from 58.61.164.40
deny from 58.61.164.41
deny from 58.61.164.42
deny from 58.61.164.139
2.屏蔽整个IP段
# 恶意访问IP 58.61.164.X
< Files 403.shtml>
order allow,deny
allow from all
< /Files>
deny from 58.61.164
屏蔽IP全部IP段的缺点:如果在这个IP段上有正式的用户也无法访问我们的网站。
过一两天再检查一下日志会发现如下拒绝访问的记录:
58.61.164.207 - - [24/Jul/2008:03:40:00 -0600] "GET /xxxx.html HTTP/1.1" 403 822 "/xxxx.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
注意“403”这里在未屏蔽前是200说明访问成功。现在显示的是403无权访问。

点这里查看Bluehost支持的环境和产品详情列表
-->点这里查看Bluehost支持的环境和产品详情列表。

作者: wwww.bluehost-cn.com
原载: Bluehost之家
本文链接: http://www.bluehost-cn.com/bluehost-cpu-exceeded

本站原创作品转载时请以链接形式注明作者和原始出处及本声明。