优化你的服务器Apache、mysql.PHP 不指定

jed , 2007-2-6 16:22 , 服务器技术 , 评论(0) , 阅读(4814) , Via 本站原创 | |
硬件上的考虑

其实起50%的作用,当然是越快越好。如果不知道哪个快,就换成越贵越好。可实际上不可能做到这些,因为银子有限,所以按照这个顺序考虑:内存越大越好- >硬盘SCSI好于SATA->CPU越快越好。下面是一个比较极端的高级配置(指运行MySQL数据库级别的网站,想克隆ebay的去扎风投然后买曙光好了):

Dual Xeon 3.x  + 4G RAM + SCSI的集群做MySQL服务器,Dual Xeon 3.x  + 4G RAM + SCSI 做HTTP。

下面是一个更为靠普的推荐配置:

Dual Xeon 3.x  + 4G RAM + SCSI做MySQL+HTTP的单机服务器

而下面这个也是更为广泛的配置:

Dual Xeon 3.x  + 2G RAM + SATA做MySQL+HTTP的单机服务器。对于这种情况需要用心优化了。

记住,当有更多预算时,首先考虑的是内存,其次是高速硬盘和RAID,最后才是CPU。

软件的版本

软件指操作系统、Apache、MySQL和PHP的版本。对于操作系统,我一直习惯使用RedHat系列,现在用的是32位的Red Hat Enterprise Linux企业版,可能是因为家里的开发PC装的是免费的Fedora Core。而目前流行的被认为最适合做Web服务器的是CentOS,不过我没有用过。

相对于OS的版本,内核的版本更为重要,建议随时升级到最新版本的内核。关于内核比较重要的事情是跟超线程CPU的兼容。早期的超线程功能往往会被禁掉,因为软件不支持,而现在的内核是支持超线程技术的,所以确保内核的更新是很有必要的。(参考文档:Hyper-Threading speeds Linux)

对于Apache、MySQL和PHP,都属于双线版本。即同时维护两个版本的产品线,我建议使用最新版本的Apache 2.0,因为Apache 2.0在HTTP的性能上做了很大的改进(Apache网站语),而MySQL根据自己的爱好,我使用MySQL 4.1系。注意如果你使用MySQL 3.x版,强烈建议你现在就升级到MySQL 4.1,你可以即刻看到网站速度提高。

对于PHP,我依然使用4.4系,因为现有的应用都是在4下面开发的,同时听说很多升级到PHP5后的惨痛故事,我就不冒险了。说到PHP,不得不抱怨几句,因为PHP的发行版经常有一些匪夷所思的BUG,比如有一次我发现某个在开发PC上用的好好的函数在服务器上突然用不了(服务器自动抢鲜升级了PHP),最后折腾1天得知PHP发布新版本的小子忘了把那个函数打包进去了(非常常用的函数apache_note)。

Apache参数的优化

按照前面提到的版本问题,Apache可以直接使用2.0版本产品线。针对Apache的优化主要是针对httpd.conf的优化,当然还有其他地方,如果特别留意的话,网上常有专家惊呼“居然这么多人忽略xxxx处的优化”等等,实际情况也确实如此,因为优化的地方实在太多了,httpd.conf只能做一个出发点。即便如此如果仅仅使用httpd.conf出厂默认值的话还是令人痛心不已。

httpd.conf的优化点有以下几处:

1. KeepAlive

我安装的Apache2.0出厂值居然是Off。除非你的网站只有文字没有图片,否则改成On。然后所有的麻烦就来了。

以前看到过一个Web2.0和Web1.0的服务比较图,有印象的就是AdSense是1.0,垃圾Chitika成了2.0,同样Akamai是1.0, BitTorrent成了2.0,真晕。其实Akamai的图片存储服务主要解决服务器的KeepAlive问题。看下面这个sample.html:

Hello world



当浏览器将请求发送给Apache后,Apache会为该用户建立连接,返回/sample.html的内容,浏览器解析HTML文件,发现还需要显示 /hello.gif,就再次向Apache发出请求。这时如果KeepAlive为Off,Apache就需要重新建立连接。试想如果页面请求了 1000个图片,Apache就需要建立1000个连接(但建立第N个时候N-x个连接已经被Apache聪明的关闭了)。如果KeepAlive为 On,Apache会在同一个连接中处理所有这些请求,大大的节省了连接资源,可惜这个世界上有很多攻击者,他们会利用这个连接不断的特性不停的请求文件,耗尽服务器的资源。所以一些大公司像Yahoo、AOL都选用Akamai作为图片存储服务,结果这些公司的sample.html版本就成了这个样子:

Hello world


(真实地图片地址会比这个复杂)

这样一来每次用户访问仅会向本机服务器的Apache请求一次,剩下的请求发送到akamai了。不必为akamai的能力担心,因为它有充足的抗负载技术,Web2.0的大喇叭们想用BT取代akamai,我靠。

2. MaxKeepAliveRequests

明白了1中的内容,这个看名字就知道一个连接可以最多发送多少次请求。默认是500。

3. KeepAliveTimeout

同样,两次请求间超过这个数字就中断这个连接。如果你的KeepAlive是On,MaxKeepAliveRequests是500, KeepAliveTimeout是100,你可以算算攻击者们用多久可以耗干你的Apache。我把KeepAliveTimeout设为5,因为从我网站受众人群的上网速度和网站的图片大小、数量考虑,5秒种可以完成加载多数页面。

4. StartServers

StartServers 的数字表示Apache启动后直接创建的httpd数量。比如你的服务器平时平均需要100个httpd,如果把StartServers设为10就会导致Apache启动之初不停的创建剩下的90个httpd。如果你的服务器平时最多就用20个httpd,把StartServers设为50就浪费了资源。这个参数没什么大不了,因为Apache会自己趋向于适合的httpd服务数。

5. MinSpareServers、MaxSpareServers

保留备用的httpd服务数最小值和最大值。即当不需要这么多httpd服务时,依然最少保留MinSpareServers个服务,但不超过MaxSpareServers个服务。需要根据Apache的运行寻找经验值。

6. ServerLimit,MaxClients

比较重要的一个值。ServerLimit通常应该等于MaxClients。MaxClients决定了最大的httpd进程数,如果攻击者占用了 MaxClients的httpd服务数,你的网站就拒绝正常访问者访问了。但MaxClients的大小受内存的限制,因此Apache2的默认值是 250,并加上了ServerLimit参数作限制,如果想设大MaxClients,必须同时扩大ServerLimit,但ServerLimit不应超过MaxClients。

7. MaxRequestsPerChild

决定了每个httpd服务可以处理的最大请求数,超过这个数字就需要新的httpd服务,后者又由MaxClients限制,环环相套。我的MaxRequestsPerChild是10000。

8. HostnameLookups

设为Off,避免DNS查询的等待。

除了这8个参数外,Apache的另一个可塑点是加载的Module,把不需要的LoadModule注释掉即可,大大的节省了内存。但是问题是你不知道那个Module不需要,即便对照着Apache的Module文档朗读各个Module作用,也只能注释掉很少几个。下面是我比较踏实的注释掉的几个Module:
mime_magic_module、info_module、userdir_module、proxy_module、proxy_ftp_module、proxy_http_module、proxy_connect_module。

PHP加速器

PHP 没什么值得优化的地方(这种东西真省心)。只是建议把php.ini中的数据库永久连接关闭以避免难堪的"Too many connections"错误。关闭php的mysql永久链接,即使php客户端mysql_pconnect这样的语句失效,但是不比担心现有的代码发生错误,因为PHP会自动将mysql_pconnect当作mysql_connect处理,并且在页面执行完毕自动关闭数据库链接。缺点是每次访问一个页面都会建立一次数据库链接,但不同于Apache的链接,因为Apache是每页都有N个链接机会,而数据库通常每页只需连接一次。

相对于对PHP本身的优化,安装一个PHP加速工具更有意义。以前是PHP Eaccelerator,而现在流行的是eAccelerator(此中有很多恩恩怨怨)。eAccelerator在程序层缓存php文件,而不是缓存php的执行、输出结果,因此不必担心时效性。eAccelerator安装非常简便,只需要按步实施即可。

eAccelerator是继前面提到的升级硬件、内存和升级MySQL到4.x外另一个可以显著导致网站速度提升的武器。
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]