昨天网站暂停半天及相关事宜

昨天下午收到了虚拟主机提供商发来的邮件,告知由于我们的网站负载过大,被暂停了。由于当时在外面,无法及时处理,晚上经过接洽,并对网站做了适当的处理,才得以恢复。而在这个过程中,我有一些想法和收获,在这里和大家分享一下。

一、虚拟主机的负载能力

所谓虚拟主机,就是提供商在一台服务器上为众多的客户(网站)提供服务,这些客户的网站共享这一台服务器的所有资源,包括:硬盘空间、内存、CPU和带宽等等。国外的主机提供商在一台服务器上可以放置多达多千个网站。这样,每个客户需要支付的费用经过这样平摊,就变得很低了。

因此,每个网站都不能使用太多的资源,我们现在这个虚拟主机的要求是:服务器上的每个帐号(客户)不能在连续的2分钟内,占用CPU超过25%,如果超过则会暂停网站。在邮件中,列出了当时我们的网站的资源占用情况,在那一个时刻,我们的网站占用了79%的CPU资源。对于我们的网站,CPU资源主要是花费在PHP动态页面上,这79%的资源主要是在同一时刻,有12个php文件被同时访问造成的。注意,这里的“12”的含义不是通常所说的“在线人数”的含义,“在线人数”一般是说在一定时间内,比如15分钟内,访问过的IP数;而这里说的12是操作系统意义上的“并发访问”,是一个瞬间的含义。因此“在线人数”要远远大于“并发访问”数量。

实际上,虚拟主机的质量是很难简单评估的,因为第一:他们不会公布一台服务器上到底会放置多少网站,第二:也不见得放置得少,效果就好。

二、虚拟主机商的服务质量

我们使用的是Hostgator的虚拟主机,我们对其提供的主机是非常满意的,主机稳定性非常好,而且服务非常到位。我们的流量每个月1000多G,这在国内的虚拟主机是很难想象的。更重要的是体现在服务上,这个具体很难量化说明,但是总体来说会感到非常舒服,比如,1:非常透明,这次停机以后,它会给出非常详细的列表说明当时的连接、进程以及CPU占用情况,2:并且他们会做出一定的分析,还给出了一个建议:由于我们的网站使用的是Wordpress系统,他们在邮件中建议使用WP Super Cache插件,我就安装了这个插件,感觉确实非常好,这样绝大多数访问,都由原来的访问动态PHP变为访问静态文件,这样对于CPU的占用,就大大降低了,而且访问速度也会加快。这也说明了一个真理——科技是第一生产力。根据这个插件的开发者的测试,这个插件可以在同样的负载情况下,支撑的访问量增加数倍。对于做网站来说,用尽量少的服务器资源,提供尽量大的支持访问能力,就是生产力,也就是钱哦。

三、令人头疼的下载问题

实际上我们的网站分为两部分,一部分是这个网站系统,即使用的Wordpress系统搭建的这个网站,这部分实际上不是构成负载的主要部分,负载主要是另一部分:提供的视频教程下载。下载是非常耗费资源的。如果不加任何限制,是不可想象的。更严重的问题在于很多人使用各种下载工具,这些下载工具都用同一个原理——多线程分块同时下载。也就是本来下载一个10M文件用一个连接,而这些软件会建立10个到服务器的连接,把这个文件分成10小块同时下载,夏在完成后再拼装成原来的文件。而且往往还会同时下载多个文件,这样,一个用户就会和服务器同时建立10X10=100个连接,这样的话,服务器当时的负担就变得超级大了。如果遇上同时有不止一个人这样做,肯定立即就会超过限制。而且,即使没有超过极限,这样做会使某一个人得到其他访问者100倍的资源,这样当然很不好。理想的状态应该尽可能使所有访问者平均地占用服务器资源。 因此,如果不使用一些限制,是肯定不行的。

四、目前我们使用的限制下载的措施

我们要做的,就是保证每一个访问的人,不要占用太多的连接,以致于影响其他访问者。实际上,如果使用独立的服务器,也就是我们的网站独自使用一台服务器的话,Apache上可以安装一个模块,就可以非常方便地限制每个IP的最大连接数,当超过这个连接数以后,直接拒绝掉超过的连接,这是非常适用于我们的情况的。但是遗憾的是,由于我们使用的是共享的主机,没有权限安装这个模块。那么怎么办呢?只能DIY一下了,自己写了一个PHP程序,来实现这个要求,当然只能部分实现了。

现在我对下载限制的是:

1:在同一个时刻,每个IP只允许有一个连接进行下载,比如说,一个用户正在下载或播放某一个视频教程,那么此时那就无法下载或播放其他视频教程。

这个要求用PHP是可以实现的,只需要把一个下载请求的IP记录在数据库中,对每次来的下载请求先在数据库中查一下,如果已经在下载文件了,那么就拒绝这个IP的请求,当一个下载结束或者人为终止以后,就在数据库中删除这个IP的记录,这是他在访问就被允许了。

但是仅仅这样做还不够,因为还会有很多人使用下载工具,大量并发地发出下载请求,而由于使用了上面第1条措施后,所有的下载请求都会转到一个PHP文件上,这样如果并发的下载请求数量很多的话,就需要服务器创建大量的PHP进程,这也是一个非常大的负担,而且Apache对于同时并发创建的PHP进程数量是有限制的。为此,我们就不得不采取第二个限制措施:

2:对于那些非常疯狂地发出并发下载请求的IP,就只能实施封锁的办法了。

我们经常会观察到一秒钟发出超过10个请求的IP,这些IP就必须要拒绝掉了。我们会记录每一个下载文件的IP在一段时间中发出的请求数量,如果超过一定限额,就封IP了,也就是这个“拒绝”命令直接由web服务器Apache发出,而不再由PHP程序发出。

目前,把疯狂发出下载请求的IP放入黑名单这个功能可以由这个程序自动实现。当然更理想的状态是经过一段时间比如1个小时以后,再自动从黑名单中去掉,这个我没有做到程序里。因此,指使人工地过一段时间把黑名单清空一次。我对PHP所知甚少,没有太多的时间把这个程序做得很复杂了。

当然在设置了上面的限制以后,对一些访问者是有麻烦的,比如在局域网中的不同的人,往往使用同一个对外的IP,这样他们就会被看作是同一个IP而加以限制。但是目前我们也只能这样了。

以后有条件的话,我们会尽可能改善服务期的条件,比如使用独立主机等等,但是还是需要一定的盈利以后,才可以做到。再不赢利的情况下,服务器的投资还无法做到很大。

如果哪位有一些更好的建议,可以告诉我们,谢谢大家两年多以来对前沿科技的支持!

3,278


欢迎您发表留言

(须填写)
(须填写,不公开)
请注意:这里输入的HTML代码会被屏蔽,如果需要讨论复杂的具体代码问题,请到我们的论坛发贴,谢谢!

17条留言