硬件上的考虑
其实起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 worldimg src="http://blog.penner.cn/hello.gif" />
当浏览器将请求发送给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 worldimg src="/hello.gif" />
(真实地图片地址会比这个复杂)这样一来每次用户访问仅会向本机服务器的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外另外一个能够显著致使网站速度提高的武器。
php