<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[优化你的服务器Apache、mysql.PHP]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Tue, 06 Feb 2007 08:22:58 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	硬件上的考虑 <br/><br/>其实起50%的作用，当然是越快越好。如果不知道哪个快，就换成越贵越好。可实际上不可能做到这些，因为银子有限，所以按照这个顺序考虑：内存越大越好- >硬盘SCSI好于SATA->CPU越快越好。下面是一个比较极端的高级配置（指运行MySQL数据库级别的网站，想克隆ebay的去扎风投然后买曙光好了）： <br/><br/>Dual Xeon 3.x &nbsp;+ 4G RAM + SCSI的集群做MySQL服务器，Dual Xeon 3.x &nbsp;+ 4G RAM + SCSI　做HTTP。 <br/><br/>下面是一个更为靠普的推荐配置： <br/><br/>Dual Xeon 3.x &nbsp;+ 4G RAM + SCSI做MySQL+HTTP的单机服务器 <br/><br/>而下面这个也是更为广泛的配置： <br/><br/>Dual Xeon 3.x &nbsp;+ 2G RAM + SATA做MySQL+HTTP的单机服务器。对于这种情况需要用心优化了。 <br/><br/>记住，当有更多预算时，首先考虑的是内存，其次是高速硬盘和RAID，最后才是CPU。 <br/><br/>软件的版本 <br/><br/>软件指操作系统、Apache、MySQL和PHP的版本。对于操作系统，我一直习惯使用RedHat系列，现在用的是32位的Red Hat Enterprise Linux企业版，可能是因为家里的开发PC装的是免费的Fedora Core。而目前流行的被认为最适合做Web服务器的是CentOS，不过我没有用过。 <br/><br/>相对于OS的版本，内核的版本更为重要，建议随时升级到最新版本的内核。关于内核比较重要的事情是跟超线程CPU的兼容。早期的超线程功能往往会被禁掉，因为软件不支持，而现在的内核是支持超线程技术的，所以确保内核的更新是很有必要的。（参考文档：Hyper-Threading speeds Linux） <br/><br/>对于Apache、MySQL和PHP，都属于双线版本。即同时维护两个版本的产品线，我建议使用最新版本的Apache 2.0，因为Apache 2.0在HTTP的性能上做了很大的改进(Apache网站语)，而MySQL根据自己的爱好，我使用MySQL 4.1系。注意如果你使用MySQL 3.x版，强烈建议你现在就升级到MySQL 4.1，你可以即刻看到网站速度提高。 <br/><br/>对于PHP，我依然使用4.4系，因为现有的应用都是在4下面开发的，同时听说很多升级到PHP5后的惨痛故事，我就不冒险了。说到PHP，不得不抱怨几句，因为PHP的发行版经常有一些匪夷所思的BUG，比如有一次我发现某个在开发PC上用的好好的函数在服务器上突然用不了（服务器自动抢鲜升级了PHP），最后折腾1天得知PHP发布新版本的小子忘了把那个函数打包进去了（非常常用的函数apache_note）。 <br/><br/>Apache参数的优化 <br/><br/>按照前面提到的版本问题，Apache可以直接使用2.0版本产品线。针对Apache的优化主要是针对httpd.conf的优化，当然还有其他地方，如果特别留意的话，网上常有专家惊呼“居然这么多人忽略xxxx处的优化”等等，实际情况也确实如此，因为优化的地方实在太多了，httpd.conf只能做一个出发点。即便如此如果仅仅使用httpd.conf出厂默认值的话还是令人痛心不已。 <br/><br/>httpd.conf的优化点有以下几处： <br/><br/>1. KeepAlive <br/><br/>我安装的Apache2.0出厂值居然是Off。除非你的网站只有文字没有图片，否则改成On。然后所有的麻烦就来了。 <br/><br/>以前看到过一个Web2.0和Web1.0的服务比较图，有印象的就是AdSense是1.0，垃圾Chitika成了2.0，同样Akamai是1.0， BitTorrent成了2.0，真晕。其实Akamai的图片存储服务主要解决服务器的KeepAlive问题。看下面这个sample.html： <br/><br/><html><body><p>Hello world</p><img src="hello.gif" /></body></html> <br/><br/>当浏览器将请求发送给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版本就成了这个样子： <br/><br/><html><body><p>Hello world</p><img src="http://a620.g.akamai.net/hello.gif" /></body></html> <br/>(真实地图片地址会比这个复杂) <br/><br/>这样一来每次用户访问仅会向本机服务器的Apache请求一次，剩下的请求发送到akamai了。不必为akamai的能力担心，因为它有充足的抗负载技术，Web2.0的大喇叭们想用BT取代akamai，我靠。 <br/><br/>2. MaxKeepAliveRequests <br/><br/>明白了1中的内容，这个看名字就知道一个连接可以最多发送多少次请求。默认是500。 <br/><br/>3. KeepAliveTimeout <br/><br/>同样，两次请求间超过这个数字就中断这个连接。如果你的KeepAlive是On，MaxKeepAliveRequests是500， KeepAliveTimeout是100，你可以算算攻击者们用多久可以耗干你的Apache。我把KeepAliveTimeout设为5，因为从我网站受众人群的上网速度和网站的图片大小、数量考虑，5秒种可以完成加载多数页面。 <br/><br/>4. StartServers <br/><br/>StartServers 的数字表示Apache启动后直接创建的httpd数量。比如你的服务器平时平均需要100个httpd，如果把StartServers设为10就会导致Apache启动之初不停的创建剩下的90个httpd。如果你的服务器平时最多就用20个httpd，把StartServers设为50就浪费了资源。这个参数没什么大不了，因为Apache会自己趋向于适合的httpd服务数。 <br/><br/>5. MinSpareServers、MaxSpareServers <br/><br/>保留备用的httpd服务数最小值和最大值。即当不需要这么多httpd服务时，依然最少保留MinSpareServers个服务，但不超过MaxSpareServers个服务。需要根据Apache的运行寻找经验值。 <br/><br/>6. ServerLimit，MaxClients <br/><br/>比较重要的一个值。ServerLimit通常应该等于MaxClients。MaxClients决定了最大的httpd进程数，如果攻击者占用了 MaxClients的httpd服务数，你的网站就拒绝正常访问者访问了。但MaxClients的大小受内存的限制，因此Apache2的默认值是 250，并加上了ServerLimit参数作限制，如果想设大MaxClients，必须同时扩大ServerLimit，但ServerLimit不应超过MaxClients。 <br/><br/>7. MaxRequestsPerChild <br/><br/>决定了每个httpd服务可以处理的最大请求数，超过这个数字就需要新的httpd服务，后者又由MaxClients限制，环环相套。我的MaxRequestsPerChild是10000。 <br/><br/>8. HostnameLookups <br/><br/>设为Off，避免DNS查询的等待。 <br/><br/>除了这8个参数外，Apache的另一个可塑点是加载的Module，把不需要的LoadModule注释掉即可，大大的节省了内存。但是问题是你不知道那个Module不需要，即便对照着Apache的Module文档朗读各个Module作用，也只能注释掉很少几个。下面是我比较踏实的注释掉的几个Module： <br/>mime_magic_module、info_module、userdir_module、proxy_module、proxy_ftp_module、proxy_http_module、proxy_connect_module。 <br/><br/>PHP加速器 <br/><br/>PHP 没什么值得优化的地方（这种东西真省心）。只是建议把php.ini中的数据库永久连接关闭以避免难堪的"Too many connections"错误。关闭php的mysql永久链接，即使php客户端mysql_pconnect这样的语句失效，但是不比担心现有的代码发生错误，因为PHP会自动将mysql_pconnect当作mysql_connect处理，并且在页面执行完毕自动关闭数据库链接。缺点是每次访问一个页面都会建立一次数据库链接，但不同于Apache的链接，因为Apache是每页都有N个链接机会，而数据库通常每页只需连接一次。 <br/><br/>相对于对PHP本身的优化，安装一个PHP加速工具更有意义。以前是PHP Eaccelerator，而现在流行的是eAccelerator（此中有很多恩恩怨怨）。eAccelerator在程序层缓存php文件，而不是缓存php的执行、输出结果，因此不必担心时效性。eAccelerator安装非常简便，只需要按步实施即可。 <br/><br/>eAccelerator是继前面提到的升级硬件、内存和升级MySQL到4.x外另一个可以显著导致网站速度提升的武器。<br/><br/>Tags - <a href="http://www.dzhope.com/tags/httpd.conf/" rel="tag">httpd.conf</a> , <a href="http://www.dzhope.com/tags/apache%25E4%25BC%2598%25E5%258C%2596/" rel="tag">apache优化</a> , <a href="http://www.dzhope.com/tags/apche/" rel="tag">apche</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 优化你的服务器Apache、mysql.PHP]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>