Apache性能提示[1]

[入库:2005年9月21日] [更新:2007年3月24日]

本文简介:


(http://www.fanqiang.com)

Apache是把正确性放在首位、把速度放在其次的通用Web服务器。即使这样,它的性能十分令人满意。  
许多站点只有不到10M的出口带宽。Apache能够在这些站点的低端Pentium服务器上全速工作。实际上,  
拥有更多带宽的站点出于一些原因(比如大量的CGI和数据库事务处理)需要用一台以上的机器满足带  
宽需求。这些原因导致了以往的Apache开发工作集中在正确性和可配置性。    

不幸的是许多人过于重视某些指标,并把它们的原始数据当作评价Web服务器优劣的标准。被普遍接受  
标准的是“原始最低性能(bare minimum performance)”,而在这以外的其他速度指标只适用于很  
小部分的市场需求。但为了避免Apache在一些市场中受到排挤,我们在Apache1.3上尽了相当的努力,  
将它与高端服务器的差距减至最小。    

另有一些人只是想试试这些东东能运行得多快。这些人竭力把Apache最后一滴性能挤出来,他们也想看  
看究竟是什么影响了Apache的性能。这篇文章的其余部分就是针对他们而撰的。    

请注意本文适用于Unix上的Apache1.3,部分内容适用于NT平台。目前的Apache尚未在NT上进行优化。  
事实上,不同的编程模型使它在NT上的性能表现相当不好。(即POSIX模型。NT借助POSIX子系统模拟  
这种编程标准,因此效率很低。Apache2.0抛弃了POSIX直接与操作系统打交道,  
性能将有所飞跃——译者注)    

关于硬件平台和操作系统    
最直接影响Web服务器性能的硬件要数RAM。一台Web服务器从不应该访问内存交换区。交换增加了每次  
请求的延时,用户将因此认为“不够快”。他们会点击[停止]并重新装载网页,这将进一步增加服务器  
的负担。您能够也有必要调节MaxClients,使您的服务器不会衍生太多的子进程而导致交换。    

除此之外的事情就没那么关键了。拥有快速的CPU、快速的网卡和硬盘都可以让您的服务器“足够快”。  
其实这足够快个词是需要凭经验去体会的。    

操作系统的选用也是值得斟酌的大问题。普遍的准则是:及时得到操作系统提供商的最新TCP/IP补丁。  
迅速涌现的HTTP服务打破了截止到1994年乃至95年的Unix内核中设定的许多假设情况。理想的选择包括  
目前的FreeBSD和Linux。    

关于运行时设置(Run-Time Configuration)    
HostnameLookups    
1.3版以前的Apache中,HostnameLookups的缺省值是On,这将导致每次请求时服务器都要进行NDS查询,  
从而增加了延迟。Apache1.3将此缺省值设为Off。在1.3及以后的版本中,如果您使用了任何  
allow from domain或deny from domain命令,所付出的代价将是两次DNS查询带来的延时(在一次逆向  
查询后跟着一次正向查询,以保证前者得到的结果是真实的)。因此为了得到最理想的性能应避免使用  
HostnameLookups(使用IP地址而非域名也是个好主意)。    

限制命令的使用范围是可行的,比如使用类似<Location /server-status>的容器。这种情况下,DNS查  
询只发生在符合条件的请求中。下面的例子使查询只发生在.html和.cgi文件的请求中:    

HostnameLookups off    
<Files ~ ".(html|cgi)$>    
HostnameLookups on    
</Files>    
关闭了DNS查询后,如果在您的CGI程序中需要DNS名称的话,可以考虑在那些程序中调用gethostbyname。    

FollowSymLinks 和 SymLinksIfOwnerMatch    
在任何情况下,只要您没有指定FollowSymLinks的选项(即Options FollowSymLinks),或者指定了  
SymLinksIfOwnerMatch选项,Apache将不得不调用额外的系统函数来检查符号链接。每次针对文件名  
的请求都将触发一次检查。比如您指定了:    

DocumentRoot /www/htdocs    
<Directory />    
Options SymLinksIfOwnerMatch    
</Directory>    
当一个指向URI /index.html的请求到来时,Apache将对/www,/www/htdocs和/www/htdocs/index.html  
分别调用lstat(2)。不仅如此,lstat的结果是从不被缓存的,因此每次请求都要重新这样的检查。如果  
您的确需要安全的符号链接的话,可以试着这样做:    

DocumentRoot /www/htdocs    
<Directory />    
Options FollowSymLinks    
</Directory>    
<Directory /www/htdocs>    
Options -FollowSymLinks +SymLinksIfOwnerMatch    
</Directory>    
这至少避免了对DocumentRoot目录本身的检查。请注意,如果在RocumentRoot之外有Alias或者  
RewriteRule涉及的目录,您需要为这些目录增加类似的选项。为了在无符号链接检查的情况下得到最  
佳性能,请在所有地方设置FollowSymLinks,并去掉所有的SymLinksIfOwnerMatch。    

AllowOverride    
在任何情况下,只要您允许覆盖(通常是.htaccess文件),Apache将试图为每次针对文件名称的请求打  
开.htaccess文件。比如:    

DocumentRoot /www/htdocs    
<Directory />    
AllowOverride all    
</Directory>    
当指向URI /index.html的请求到来时,Apache将试图打开  
/.htaccess、/www/.htaccess和/www/htdocs/.htaccess。这个问题可以用类似解决FollowSymLinks的方  
法解决。为了得到最佳性能,在所有地方使用AllowOverride None。    

内容协商    
如果您对每处细微的性能调节都很在意,在可能的情况下避免内容协商(content-negotiation)。实际  
应用中,协商的益处超过了给性能带来的损失。您可以在一种情况下提速服务器:避免使用这样的通配符:    

DirectoryIndex index    
请列出所有可能的情况:    

DirectoryIndex index.cgi index.pl index.shtml index.html    
并把最常用的选择放在前面。    

     

进程的建立    

本文关键:Apache性能提示
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top