斑竹网络专注为中小企业客户提供以管理服务为核心的IT全方位服务 https://www.sysadm.cn
分类: 系统运维
2013-11-21 16:34:06
apache管理
(整理时间:2010-04-07)
对webserver性能影响最大的硬件是内存。WEB服务器应当不要使用交换分区(swap),因为交换会增加每个请求的响应时间,这让用户看起来不会足够快。这会使用户不停的点击停止和刷新,从而增加了系统的负载。你可以而且应当设置MaxCients ,以使服务器不会因为生成太多的子进程而产生交换(意思就是说,要控制apache的进程数,以便使用apache不会过多使用交换分区)。这个过程是很简单的:通过使用top等工具来查看系统中apache进程的平均数是多少,然后除了留下一定的内存空间给其它进程以后,就将可用的内存分配给apache来使用 (apache 可以限制使用内存的大小的,批令是:RLimitMEM bytes|max 。
这个指令有一个或两参数,前面一个是软限制,后面一个是最大资源的限制。
其余的就是要有足够快的CPU,足够快的网卡和足够快的磁盘。这里的“足够快”是需要凭经验来做决定的。
操作系统的选择是一个比较大的事情,这里有一些被证明是比较有用的指导:
a) 运行最新的稳定版本,并将你选择的操作的补丁打到最新的。很多操作系统的提供商,最近几年都对他们系统的TCP和线程库的性能做了很大的提升。
b) 如果你选择的操作系统支持sendfile系统调用,那么你应确认你安装的版本或打了补丁能使这个功能可用。(例如,Linux ,就需要使用Linux2.4或以后的版本,而对Solair 8 的早期版,你需要打补丁)。在sendfile系统调用可用的系统上,sendfile可以使用Apache2处理静态内容更快,并且更少的占用CPU时间。
在Apache1.3之前的版本,HostnameLookups 默认是on的。这会增加每个请求的反应时间,因为这会使请求在完成之前需要先进行DNS查询解析完成。在Apache1.3的版本中,这个值的默认值是off的。如果你需要将日志文件中地址转换成主机名,可以使用带apache软件包一起发布的logresolve的程序(这个程序在apache软件包的support目录下,编译安装好的程序在bin下)。也可以使用任何可用的日志分析工具。
建议你在对以前的日志进行分类处理时,在其它的机器上进行,以勉对web服务器的情能有影响。
如果你使用任何Allow 域或Deny域(例如,使用主机名或域名,而不是IP地址)时,那么就需要做两次DNS的查询(先做一次解析,然后再做一次反解析以确认解析不是被欺骗的)。因此,为了获得最佳的性能,在这些指令中应该使用IP地址,而不是名字,如果可能的话。
注意指令可能限制在一定的范围,例如在
HostnameLookups off
HostnameLookups on
但是,可能在某些CGIs程序里需要使用DNS名字,那么可以使用gethostbyname来获取对应的名字。
FollowSymLinks 和 SymLinksIfOwnerMatch
在URL名字空间里,如果没有Options FollowSymLinks ,或者使用了Options SymLinksIfOmnerMatch选项,那么Apache将不得不进行额外的系统调用来检查系统的符号连接。这种额外的调用会针对每个文件,例如,如果使用下列情况:
DocumentRoot /www/htdocs
Options SymLinksIfOwnerMatch
那针对/index.html的请求,那么Apache会调用lstat来对/www,/www/htdocs,和/www/htdocs/index.html进行检查。而且这些检查的结果不会被缓存,所以这种检查会对每个简单的请求都会进行。如果你确实需要使用系统符号连接来进行安全检查,你可以使用下列的方式:
DocumentRoot /www/htdocs
Options FollowSymLinks
Options -FollowSymLinks +SymLinksIfOwnerMatch
在这种情况下,至少可以避免对DocumentRoot路径的内容进行额外的检查。需要注意的是,如果你使用Alias或RewriteRule将路径指定到DocumentRoot之外,那么你也应该要添加类似的内容(注:也就是说如果用了Alias或RewriteRule来指定了新的路径,且这个路径在DocumentRoot指定的路径之外,那么也应该在新的路径的Directory下指定Options -FollowSymLinks +SymLinksIfOwnerMatch内容)
AllowOverride
如果在URL地址空间里,如果使用了allow override指令(默认是.htaccess文件),那么Apache会针对每个文件名的构成都会试图打开.htaccess文件。例如:
DocumentRoot /www/htdocs
AllowOverride all
那么,当有请求/index.html时,Apache就会试图打开/.htaccess , /www/.htaccess 和/www/htdocs/.htaccess文件。和前面所述的关于Options FollowSymLinks类似,为了获得最佳的情能,应在文件系统的每个地方都使用 AllowOverride None(注:个人的理解是:也就是在每个
Negotiation 内容协商
如果真的很在意性能的话,可以不要使用内容协商(注:也就是针对不同种语言的浏览器调用不同的页面)。不过在实践中,使用内容协商所得的好处要大于因为使用协商而损失的性能。另外,可以有一个办法可以使服务器加速,那就是使用具体的默认首页列表来代替扩展配置,例如:
DirectoryIndex index
用下面这个配置来代替上面的:
DirectoryIndex index.cgi index.pl index.shtml index.html
将最常用的文件名写在最前面。
另外,也要注意到,在内容协商方面建立一个类型映射(type-map)文件比使用MultiViews更能提升性能,因为读单个文件比扫描一个目录来获得文件要来得快。
如果你的网站考虑使用类型映射文件代替MultiViews指令来完成内容协商。请参看“”文档,来获得关于内容协商方法的论述及建立类型映射的介绍。
Memory-mapping 内存映射
当Apache 2.x 需要读取被发送的文件的内容时—例如,当执行服务器端包含时—通常时需要进行文件内存映射,如果操作系统支持某些形式的mmap
在某些平台下,这种内存映射可以提升性能。然面,也存在这种情况,内存映射会损害性能甚至httpd的稳定性。
a. 在某些操作系统下,mmap不会随着CPU数量的增加而做相应调整。例如,在多处理器的Solaris服务器上,有时候禁止mmap可以使Apache 2.x发送服务端解析文件更快。
b. 如果内存映射文件存放在一个NFS分区上,而另外一台NFS客户端机器正好对这个文件进行删除或修改,那么apache会在下次访问这个文件时出错。
如果上述这些情况发生时,你应该使用EnableMMAP来禁止内存映射的传送文件(注意:这个指令会被每个Directory里的内容覆盖掉)
Sendfile
在有些情况下,Apache 2.x会忽略被传送的文件内容—例如,当被传送的文件是静态文件时—如果操作系统支持sendfile操作的话,它会使用内核的sendfile支持。
在大多数的平台下,使用sendfile,通过合并分离的读取和发送机制来提升性能。但是,也存在使用sendfile而影响httpd的稳定性的情况。
l 有些平台可能存在编译系统不能检测到的有缺陷的sendfile支持,特别是将另外一台编译好的二进制文件移到有缺陷的sendfile支持的机器上。
l 在使用NFS文件时,内核可能不能仅靠自己的缓存提供可靠的服务;
当上述这些情况发生时,应该使用EnableSendfile off来禁止sendfile传送文件内容。(注意:这个指令会被每个
Process Creation 进程创建
在Apache 1.3以前的版本中,MinSpareServers,MaxSpareServers,和StartServers的设置会对性能有很大的影响,优其是,Apache要启动达到为客户服务的子进程数需要一个过程。当服务器达到初始的StartServers个子进程之后,apache每秒钟只会增加一个子进程,以达到MinSpareServers设定的数字。所以,当有100个客户端同时访问时,而使用StartServers 的默认值为5,那么将要花掉95秒钟来生成足够的100个子进程来处理负载。这个过程在现实的服务器中(可以理解为在生产服务器上)还好,因为它们不频繁的重启。但是,在哪些运行10分钟就要重启一次的服务器上是很糟糕的事情。
每秒生成一个子进程的机制是为了避免因为在启动时生成子进程而拖累服务器。如果服务器都忙于生成子进程了,那它就不能够来响应请求了。但是现在已经认识到,这是对Apache的性能的影响是巨大的,以至于不得不考虑替代方案。所以在Apache1.3中,放松了每秒钟生成一个子进程的规则。变为第一秒生成一个子进程,过一秒后,生成两个子进程,再等一秒,生成4个子进程,这样指数形式的增加,以至到每秒钟生32个子进程,并且在子进程数据达到了MinSpareServers设定的值后,停止增加。
一般来说,没有必要调整MinSpareServers, MaxSpareServers和StartServers参数,这个正常能满足要求。当每秒钟生成超过4个进程的时候,会在ErrorLog里有相应的信息。如果你看到大量这样的信息,才需要调整设置,可以参考mod_status的输出来。
与建立进程相关的是由MaxRequestsPerChild设置而引起的进程的死亡而减少。这个设置默认值是0,这意味着每个子进程处理请求的数量是不限制的。如果你的配置中,当前这个值设置得很小,例如30,你可能希望设置得大一些。如果你运行的是Sun的操作系统或Solaris老的版本,让这个值限制在10000以内,因为超过这个值会导致内存泄露。