怎样优化Apache服务器的性能
通过挤出Apache服务器的每一分潜力你可以让你的网站留给别人的印象大大改观,特别是对一些动态网站更是如何。这篇文章主要涉及到对Apache服务器的安装和设置如何进行优化,这也是你最有控制权的部分。
测试与提高性能
Apache服务器已经被设计得尽可能的快,即使你用一台配置不高的机器,用不着进行太复杂的设置,它的响应内容就足以塞满以前的各种窄带连接。但随网站内容日益复杂和带宽的增加,对Apache进行优化以取得更好的性能变得日益重要起来。
如果优化的结果仅仅是极小的性能提升那真是浪费时间。试想一下,你花了好几个小时甚至几天调整Apache的各种参数但结果仅是几个百分点的性能提升?因此,在优化前你做的第一步应该是测试你目前的服务器的性能水平以便决定如何优化你的服务器并衡量优化的效果。
关于对Apache的测试我们已经不是第一次提到了(见《冲出水面》一文),如同我们以前提到的,确定到底是哪一部分导致的瓶颈往往是一件困难的事,是因为Apache本身的设置问题还是由于你使用的动态网站程序环境?关于查找是否是因为网站程序引起的问题已经超出了本文的范围,这里我们主要讲一下提高Apache服务器速度的一些通常做法以及它如何与构成WEB网站的其它组件进行交互。
主机硬件
Apache所在的机器与操作系统环境是对性能影响最大因素,很明显,一以368的PC与一台P4或双处理器的机器不会有同样的性能。不过,如果不涉及硬件的改变,我们可以做的最大的事是首先看一下Apache是否运行在一台专用的服务器上,如果与其它应用共用一台服务器肯定会影响服务器的性能。
在大多数情况下,告别是对静态网站而言,内存数量是一个影响性能的关键因素,因为它决定了Apache可以缓存多少内容。它缓存的内容越多,在硬盘上读取内容的机会就越少,而存取硬盘上的特定文件是一件很费时的操作。如果你的网站主要是一些静态内容,你最好使用mod_cache选项,如果你的内存足够大,可以使用mod_mem_cache选项。
第一个选项将信息缓存在磁盘上,当它与mod_include选项一起使用时会有很好的效果,这个选项在建立一个页面时在缓存中保存它的最终版本。使用mod_mem_cache将缓存内容保存在一个可以被所有Apache进程共享的内存堆中。
使用更快的磁盘或进一步使用RAID可以提高Apache对磁盘文件的访问速度。3
注意,如果你做了下面的所有这些优化,一个硬件的(而非软件)升级方案是更好的选择。
最后一个谈到的关于硬件的问题是CPU能力,这对动态内容网站的影响很大,动态内容越多要求越高。
主机环境
不管是使用何种操作系统,下面这些原则都是适用的:
●尽可能减少非必要的后台运行的程序数目。如果你真的很关心服务器性能,你甚至可以关闭一些通常被认为是必要的后台服务。比如在UNIX下面,你可以关闭NFS服务,任何打印服务甚至邮件发送服务(如果不使用这些服务),在Windows系统下,使用控制面板优化系统和缓存,当然,对于必要的服务(如MySQL)仍然需要运行。
●避免使用系统。如果在服务器运行时你利用它进行其它工作(如编译软件,编辑文件或配置机器)你必将降低服务器提供的性能。如果你必须在上面安装一些组件,你可以在其它机器上编译好后拷备到服务器上。
●让你的系统组件维持在最新。虽然这主要是从安全角度的建议,不过软件补丁往往提供了网络和I/O方面的性能提升。
Apache程序
下面,就谈到Apache本身了。
首先你确认一下是否Apache在编译时是否仅包含了你的网站需要的组件。这意味着,你可以忽略一些用不着的组件。这使它占用的内存更少,而且,它也表示你不用意外的激活一些选项降低服务器的性能。
静态还是动态
灵活性常是一些Apache管理员考虑的主要因素,但灵活性也有代价,使用动态载入模块非常方便,但它将导致性能下降,因为在需要时模块才会被载入。不过动态模块也有利于减少服务器对内存的需求。
为了装Apache安装成静态模式,使用设置脚本定义你需要的模块,但是不要将它们定义为共享的(例如:使用--enable-rewrite而不要用--enable-rewrite=shared,也不要用共享选项--enable-so)。
模块设置
如果你使用Apacher的静态模式,你必须小心选项载入的模块,这是静态模式带来的一个开销--载入的模块越多,占用的内存越大,对于使用分叉多线程模型的程序这个效果更是明显。
注意一些项目是被自动包含的,因此你需要显式的指定包含或禁用需要的模块。另外要记住如果需要包含进来一些如认证,PHP或mod_perl这样的第三方模块,你需要WEB服务(Web service),使用configure -help命令来查看可以使用的选项列表。
服务器设置
如果你的环境已经建立Apache也已经经过优化,就可以查看你的设置文件来进行下一步的优化措施。一个好的方法就是简化你的设置文件将文件中的指示(directives)减少到几百行内,首先是删除掉那些注释行,进而删除任何非必要的内容。
简化设置文件
第一步是简化设置设置文件,它并不带来任何直接的性能提升,但它将使设置文件易于使用减少你出错的机会。
在进行优化之前,从一个默认提供的设置文件开始是一个不错的主意。这些文件常被放在Apache的设置目录中,文件名为httpd.conf.orig或者 httpd-std.conf,不要使用如performance-std.conf类似名称的文件,从长远的观点看,如果你准备在里面加入大量的附加设置信息,它决不是一个好起点。另一方面,如果你的目标是建立一个很快的静态WEB服务器,这可能是让服务器运行起来的最简单方法。
如果你熟悉Apache的设置指示用法或乐意浏览帮助文件,你可以从设置文件中删除所有的注释内容,因为它们经常让实际的指示内容变得难找,你也可以删除对当前平台上用不到的多处理机方式(MPM)的引用。
禁用模块
现在,我们已经得到了一个清爽的设置文件,下面我们可以开始删除其中我们系统用不到的元素,特别是:
●HostnameLookups(主机名查找),这增加了处理每个请求的开销,首先,服务器会对DNS系统做一个反向查询以找出客户系统的主机名,然后又进行正向查询看获得的主机名是否真实指向客户的IP。大多数情况下,你可以简单的关闭这个功能,如果你经常处理服务器日志,这个工作完全可以在以后进行。你可以通过在设置文件中加入指示HostnameLookups off来关闭这个功能。
●符号连接。当打开这个选项时,Apache将检查每个请求中是否包含对符号连接的引用,这将对请求中包含的每个路径调用一次lstat()系统调用。除非你准备使用符号连接,否则用<Directory /> Options -FollowSymLinks </Directory>来关掉它。
●服务器状态信息。尽管这对测试与监控服务器很有用,但它也为服务器带来了额外的开销,你可以通过寻找任何类似SetHandler server-status的指示来关闭,如果可能,你可以在安装Apache时移除这个模块。
●在可以更精确的时候尽可能不要使用通配符之类的灵活选项,例如,对于DirectoryIndex指示,明确的指定设置文件列表,最常用的放在最前。
●除非你有很好的理由否则就允许CGI的执行,将似有的CGI文件放到一个特定的目录并为之设定正确的权限,这避免了Apache对每一个请求都要判断一次要求的是一个静态文件还是一个动态文件。
禁用日志
写入日志信息是一个很花费时间的工作,尽管Apache保持日志文件的打开状态以节省打开文件的时间,但仍然得花费不少的时间。如果没有必要存储日志信息,你可以关闭这个选项以节省出更多的处理器时间,只需要在设置文件中把日志那一行注释掉就可以关掉它。
如果必须保留日志,你可以关闭HostnameLookups选项(见上文)然后把日志文件拷备到另一台机器上做进一步分析。
简化目录级的设置
htaccess文件可以极大的扩展Apache的设置参数,而无需每次你改变设计都要编辑Apache主设置文件,但对这个文件的使用也降低了服务器的性能。
如果使用这个文件,Apache必需首先在当前目录中查找是否存在这个文件,如果存在就解析这个文件并在当前目录中应用文件中的设置。更坏的是,Apache不仅要查看当前的目录,还要查看当前目录的所有上层目录是否包括htaccess文件以根据所有这些文件最终确定设置。
如果你想最优化服务器的性能,你应该禁止使用htaccess文件,任何基本目录的设置都可以在主设置文件中进行,而主设置文件仅在服务器启动时解析一次。
为了禁用htaccess文件,在任何<Directory>节里加上指示AllowOverride None。
多处理方式设置
多处理方式(Multi-Processing Module/MPM)他允许特定平台处理多个并发连接。MPM模块是平台相关的,对于Unix、Windows、BeOS、和NetWare有不同的解决方案,一些平台有不止一个方案可以选择。对大多数用户而言,对于特定平台的默认设置已经工作得很好,而精确调整这些参数是一个费时的工作。不过如果你想最大限度的挖掘Apache的潜力,你必须调整这些设置。
对大多数平台而言,只有一种MPM可选,不过在UNIX下则有两个选项:prefork与worker,prefork模式生成多个相同的Apache进程,而worker模式创建多个线程。通常而言,对于只有一到两颗处理器的系统,prefork模式工作得更好,而对于拥有更多处理器的系统,线程模型工作得更有效率。
不管哪种情况,MaxClients指示是最有效的提高服务器性能的方法,它控制了Apache可以处理的最大并发连接数。
优化静态内容
如果你的WEB服务器使用了大量静态内容或者你分别用两个WEB服务器处理动态和静态内容,那么你现在的主要目标就是缩短服务器发送被请求内容的响应时间,最简单的方法就是使用mod_cache缓存模块。你可以使用mod_disk_cache和mod_mem_cache来分别提供基于磁盘的缓存和基于内存的缓存。
你可以查看关于mod_cache的说明文件以取得进一步的信息。
优化动态内容
动态内容可能是所有WEB服务器中最消费时间的部分,特别是使用CGI的时候,一个简单的程序都可能会把响应时间增加好几秒。
使用基于脚本的方案的一大好处是它们在Apache里装入了解释器,这就减少了执行时再装入解释器的时间,一些方案还把解析过的脚本缓存起来,这样下一次遇到同样的请求就可以直接执行而无需再次解析。
对特定系统的调整优化很复杂而且很花时间,而且你需要调整特定的脚本以利用优化的成果。
不过对动态内容的优化效果是非常明显的,仅仅是把perl脚本的执行模式从CGI转到mod_perl就可以减少多达70%的执行时间,如果我们进一步,还可以使用到数据库的持久连接或在多次请求之间缓存信息,这对电子商务网站非常有用,它也减小了不同请求间重复装载信息的开销。
总结
尽管Apache是一个高可定制的功能强大且相当复杂的服务器软件,我们很有兴趣的注意到即使是Apache的标准安装也可以得到不错的性能。调整Apache的设置参数是一个可以轻易显著提高服务器性能的方法。但不幸的是,常常我们在Apache里最无法控制的内容--例如网站的动态内容脚本和CGI是影响网站性能的最重要方面,如果你管理一个典型的Apache服务器你会发现Apache响应一个传入连接以及最后把内容发送给客户的所花费的时间是以毫秒记的,而等待所需数据资源的时间常常达到几秒钟。
当然,这并不是说我们的优化工作没什么意义,优化的效果日积月累也不可小视。另外,重要的是,通过简化你的设置文件,你可以大大减小服务器的管理负担。
http://www.31896.net/html/2005-12-2/11112323419.shtml
(字节数 : 5728)
mod_cache:
CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
计算方式是:
expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor
而
expire date = 目前时间 + expire period
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。
mod_disk_cache:
CacheRoot: 指定磁碟快取所使用的目录。
CacheSize: 以 KByte 为单位指定快取使用的磁碟空间大小。
CacheDirLength: 指定各目录 (的键值) 存在于快取阶层 (hierarchy) 中所使用的字元数。
CacheDirLevels: 指定快取的目录层数; CacheDirLength 与此 CacheDirLevels 设定值相乘不能超过 20。
CacheGcInterval: 指定收垃圾 (Garbage Collection) 的动作间隔时间;单位是小时。不过根据 Apache2 文件,这个指令还 没有被实作 。
mod_mem_cache:
MCacheSize: 以 KByte 为单位指定快取使用的记忆体空间大小。
MCacheMaxObjectCount: 指定快取物件数目的最大值;预设值是 1009。
MCacheMaxObjectSize: 指定最大可快取物件的大小,单位是 Byte;预设值是 10000 (Bytes)。
MCacheMinObjectSize: 指定最小可快取物件的大小,单位是 Byte;预设值是 0 (Bytes)。
修改httpd.conf这个文件
#一个连接的最大请求数量
MaxKeepAliveRequests 10000
#NT环境,只能配置这个参数来提供性能
<IfModule mpm_winnt.c>
#每个进程的线程数,最大1920。NT只启动父子两个进程,不能设置启动多个进程
ThreadsPerChild 1900
每个子进程能够处理的最大请求数
MaxRequestsPerChild 10000
</IfModule>
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_cache.c>
CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot c:/cacheroot
CacheSize 327680
CacheDirLength 4
CacheDirLevels 5
CacheGcInterval 4
</IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 8192
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1
MCacheMaxObjectSize 51200
</IfModule>
</IfModule>
(字节数 : 2450)
AllowOverride以及Options相关指令
Apache的配置文件httpd.conf是主要的配置文件,但是针对每个目录,apache还允许在它们各自的目录下防止一个叫做.htacess的文件,这个文件同样也能控制这个目录的属性
AllowOverride参数就是指明Apache服务器是否去找.htacess文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件,如果设置为All,那么所有在.htaccess文件里有的指令都将被重写。对于AllowOverride,还可以对它指定如下一些能被重写的指令类型.
1 AuthConfig 允许使用所有的权限指令,他们包括AuthDBMGroupFile AuthDBMUserFile AuthGroupFile AuthName AuthTypeAuthUserFile和Require
2 FileInfo 允许使用文件控制类型的指令。它们包括AddEncoding AddLanguage AddType DEfaultType ErrorDocument LanguagePriority
3 Indexes 允许使用目录控制类型的指令。它们包括AddDescription AddIcon AddIconByEncoding AddIconByType DefaultIcon DirectoryIndex FancyIndexing HeaderName IndexIgnore IndexOptions ReadmeName
4 Limit 允许使用权限控制指令。它们包括Allow Deny和Order
5 Options 允许使用控制目录特征的指令.他们包括Options 和XBitHack
Options
1 All 准许以下除MultiViews以外所有功能
2 MultiViews 允许多重内容被浏览,如果你的目录下有一个叫做foo.txt的文件,那么你可以通过/foo来访问到它,这对于一个多语言内容的站点比较有用
3 Indexes 若该目录下无index文件,则准许显示该目录下的文件以供选择
4 IncludesNOEXEC 准许SSI,但不可使用#exec和#include功能
5 Includes 准许SSI
6 FollowSymLinks 在该目录中,服务器将跟踪符号链接。注意,即使服务器跟踪符号链接,它也不会改变用来匹配不同区域的路径名,如果在<Local>;标记内设置,该选项会被忽略
7 SymLinksIfOwnerMatch 在该目录中仅仅跟踪本站点内的链接
8 ExecCGI 在该目录下准许使用CGI
用mod_deflate加速你的网站下载
安装apache时默认会自动安装deflate模块,这个模块其实代替了原先apache1版本中的mod_gzip,功能还是一样的。
首先,确认是否安装了该模块:
#cat httpd.conf | grep 'deflate'
如果存在就在httpd.conf 中添加如下文本:
<Location />
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnv IfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>
BrowserMatch:由于压缩传输并不被所有的浏览器支持,这里的设置为“Mozilla/4 以后版本仅压缩文本;低于4.0.678版本的Mozilla不压缩;IE不使用gzip压缩文本”
SetEnv设置:不压缩以gif,jp?g或者png结尾的图片文件(压缩也没多少)。
Header append :添加浏览器header标识“该页面已被压缩”.
对于apache服务器而言,它是以内存消耗为主的,但鉴于现在的网络质量而言,经常瓶颈在传输速度上。其实一台P3 800+1G内存的apache2在静态页面下足可以占满100M带宽,故利用压缩的方式传输不失为一种加快网站响应速度的好方法。但这种方法的缺点在于不支持某些浏览器,而且会出现“该文件大小未知”的提示。
(字节数 : 3010)
摘要:对于所有的ICP来说,除了保证网站稳定正常运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,对提高各个网站的服务能力和服务水平是必不可少的。通过对Web服务器的日志文件进行分析和统计,能够有效掌握系统运行情况以及网站内容的受访问情况、加强对整个网站及其内容的维护与管理。本文对Web服务器日志分析的原理和技术进行讨论。
文章相关软件:
| webalizer | http://www.mrunix.net/webalizer/ |
| cronolog | http://www.cronolog.org/ |
| Apache | http://www.apache.org/ |
一、 前言
随着Internet上Web服务的发展,几乎各个政府部门、公司、大专院校、科研院所等都在构建或正在建设自己的网站。而与此同时,在构建网站建设中各个单位都会遇到各种各样的问题,那么对web服务器的运行和访问情况进行详细和周全的分析对于了解网站运行情况,发现网站存在的不足,促进网站的更好发展重要性是不言而喻的。
管理Web网站不只是监视Web的速度和Web的内容传送,它要求不仅仅关注服务器每天的吞吐量,还要了解对这些Web网站的外来访问,了解网站各页面的访问情况,根据各页面的点击频率来改善网页的内容和质量、提高内容的可读性,跟踪包含有商业交易的步骤以及管理Web网站“幕后”的数据等。
为了更好地提供WWW服务,监控WEB服务器的运行情况、了解网站内容的详细访问状况就越来越显得重要和迫切了。而这些要求都可以通过对web服务器的日志文件的统计和分析来做到。
二、WEB日志分析的原理
网站服务器日志记录了web服务器接收处理请求以及运行时错误等各种原始信息。通过对日志进行统计、分析、综合,就能有效地掌握服务器的运行状况,发现和排除错误原因、了解客户访问分布等,更好的加强系统的维护和管理。
在WWW服务模型是非常简单的(见图1):
1) 客户端(浏览器)和web服务器建立tcp连接,连接建立以后,向web 服务器发出访问请求(如:get),根据HTTP协议该请求中包含了客户端的IP地址、浏览器的类型、请求的URL等一系列信息。
图1 web访问机制
2) web服务器收到请求后,将客户端要求的页面内容返回到客户端。如果出现错误,那么返回错误代码。
3) 服务器端将访问信息和错误信息纪录到日志文件里。下面是客户端发送给web服务器请求的数据报的内容:
GET /engineer/ideal/list.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://www.linuxaid.com.cn/engineer/ideal/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.linuxaid.com.cn
Connection: Keep-Alive
可以看到,在客户机的请求里包含了很多有用的信息,例如:客户端类型等等。而web服务器就会将请求的web页内容发送返回给客户机。
目前最常用的web服务器有Apache、Netscape enterprise server、MS IIS等。而目前互联网上最常用的web服务器就是apache,因此我们这里的讨论都以Linux+apache环境讨论,其他的应用环境类似。对于Apache来说,支持多种日志文件格式,最常见的是common和combined两种模式,其中combined方式比common方式的日志的信息要多Referer(该请求来自于哪里,例如来自于yahoo的搜索引擎)和User-agent(用户客户端类型,如mozilla或IE)。我们这里讨论combined类型。下面是common类型的日志示例:
218.242.102.121 - - [06/Dec/2002:00:00:00 +0000] "GET /2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)"
61.139.226.47 - - [06/Dec/2002:00:00:00 +0000] "GET /cgi-bin/guanggaotmp.cgi?1 HTTP/1.1" 200 178 "http://www3.beareyes.com.cn/1/index.php" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"
218.75.41.11 - - [06/Dec/2002:00:00:00 +0000] "GET /2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"
61.187.207.104 - - [06/Dec/2002:00:00:00 +0000] "GET /images/logolun1.gif HTTP/1.1" 304 0 "http://www2.beareyes.com.cn/bbs/b.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
211.150.229.228 - - [06/Dec/2002:00:00:00 +0000] "GET /2/face/pub/image_top_l.gif HTTP/1.1" 200 260 "http://www.beareyes.com/2/lib/200201/12/20020112004.htm" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"
从上面的日志文件可以看出日志记录会记录客户端的IP地址、访问发生的时间、访问请求的页面、web服务器对于该请求返回的状态信息、返回给客户端的内容的大小(以字节为单位)、该请求的引用地址、客户浏览器类型等信息。
三、apache日志的配置和管理
本文中我们假设我们的apache运行有两个虚拟主机:www.secfocus.com和www.tomorrowtel.com。我们需要对这两个虚拟主机分别进行访问日志分析和统计。
Apache配置文件中,我们需要关心的和日志相关的配置有两个:
CustomLog /www/logs/access_log common
ErrorLog /www/logs/error_log
CustomLog用来指示apache的访问日志的存放位置(这里保存在/www/logs/access_log中)和格式(这里为common);ErrorLog用来指示apache错误信息日志的存放位置。
对于不配置虚拟主机的服务器来说,只需要直接在httpd.conf中查找CustomLOg的配置进行修改即可;而对于具有多个虚拟服务器的web服务器来说,需要分离各个虚拟服务器的访问日志,以便对各个虚拟服务器进行访问统计和分析。因此这就需要在虚拟服务器配置中进行独立的日志配置,示例:
NameVirtualHost 75.8.18.19
ServerName www.secfocus.com
ServerAdmin secfocus@secfocus.com
DocumentRoot /www/htdocs/secfocus/
CustomLog "/www/log/secfocus" combined
Alias /usage/ "/www/log/secfocus/usage/"
ServerName www.tomorrowtel.com
ServerAdmin tomorrowtel @ tomorrowtel.com
DocumentRoot /www/htdocs/ tomorrowtel
CustomLog "/www/log/tomorrowtel " combined
Alias /usage/ "/www/log/tomorrowtel/usage/"
这里需要注意的是每个虚拟主机的定义都有一个CustomLog命令,用来指定该虚拟主机访问日志的存放文件;而Alias命令用来让日志分析生成的报表能通过www.secfocus.com/usage/的方式来访问。通过上面的配置就完成了日志文件的保存。
但是下来遇到的一个问题就是日志文件的轮循,因为日志是一直在增大的,如果不进行处理那么日志文件会越来越大,会影响web服务器运行效率;速率,还可能过大耗尽服务器硬盘空间,导致服务器无法正常运行,另外如果单个日志文件大于操作系统单文件尺寸的的限制,从而更进一步影响web服务的运行。而且日志文件如果不进行轮循也不变于日志统计分析程序的运行,因为日志统计分析都是以天为单位进行统计分析的,跨越很长时间日志会使得日志统计分析程序运行特别慢。因此这里就需要对web服务器日志文件每天进行轮循。
四、web服务器日志轮循
web服务器日志轮循比较好的方式有三种:第一种方法是利用Linux系统自身的日志文件轮循机制:logrotate;第二种方法是利用apache自带的日志轮循程序rotatelogs;第三种是使用在apache的FAQ中推荐发展已经比较成熟的一个日志轮循工具cronolog。
对于大型的WEB服务来说,其往往使用实用负载均衡技术提高web站点服务能力,这样后台有多个服务器提供WEB服务,这大大方便了服务的分布规划和扩展性,但多个服务器的分布就需要对日志进行合并统一进行统计分析。因此为了保证统计的精确性就需要严格按照每天的时段来自动生成日志文件。
4.1 logrotate实现日志轮循
首先我们讨论采用Linux系统自身的日志文件轮循机制:logrotate的方法。Logrotate是Linux系统自身带的一个日志轮循程序,是专门对各种系统日志(syslogd,mail)进行轮循的程序。该程序是由运行程序的服务crond来每天凌晨4:02运行的,可以在/etc/cron.daily目录下可以看到logrotate文件,其内容如下:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
可以看到每天清晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循。
而在/etc/logrorate.conf中可以看到内容如下:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
从logrotate的配置文件中可以看到除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此我们只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循web服务器的日志文件即可,下面是一个示例:
/www/log/secfocus {
rotate 2
daily
missingok
sharedscripts
postrotate
/usr/bin/killall -HUP httpd 2> /dev/null || true
endscript
}
/www/log/tomorrowtel {
rotate 2
daily
missingok
sharedscripts
postrotate
/usr/bin/killall -HUP httpd 2> /dev/null || true
endscript
}
这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有:access_log、access_log.1、access_log.2三个日志备份文件。就这样就实现了对两个虚拟主机的日志文件的轮循。后面我们会讨论如何使用日志统计分析软件对日志文件进行处理。
这种方法的优点是不需要其他第三方工具就可以实现日志轮循,但是对于重负载的服务器和使用负载均衡技术的web服务器来说这种方法就不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。
4.2 使用apache自带的rotatelogs实现日志轮循
apache提供了将不把日志直接写入文件,而是通过管道发送给另外一个程序的能力,这样就大大的加强了对日志进行处理的能力,这个通过管道得到的程序可以是任何程序:如日志分析,压缩日志等。要实现将日志写到管道只需要将配置中日志文件部分的内容替换为“|程序名“即可,例如:
# compressed logs
CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common
这样就可以实用apache自带的轮循工具:rotatelogs来对日志文件进行轮循。rotatelogs基本是用来按时间或按大小控制日志的。
CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" common
上面的示例中apache访问日志被发送给程序rotatelogs,rotatelogs将日志写入/www/logs/secfocus/access_log,并每隔86400秒(一天)对日志进行一次轮循。轮循以后的文件名为/www/logs/secfocus/access_log.nnnn,这里nnn是开始记录日志的时间。因此为了将日志按天对齐就需要在凌晨00:00启动服务,使得每天轮循得到的日志刚好是完整一天的日志,以提供给访问统计分析程序进行处理。如果是00:00开始生成新的日志,那么轮循得到的日志就是access_log.0000。
4.3 使用cronolog实现日志轮循
首先需要下载和安装cronolog,可以到http://www.cronolog.org下载最新版本的cronolog。下载完毕以后,解压安装即可,方法如下所示:
[root@mail root]# tar xvfz cronolog-1.6.2.tar.gz
[root@mail root]# cd cronolog-1.6.2
[root@mail cronolog-1.6.2]# ./configure
[root@mail cronolog-1.6.2]# make
[root@mail cronolog-1.6.2]# make check
[root@mail cronolog-1.6.2]# make install
这就完成了cronolog的配置和安装,默认情况下cronolog是安装在/usr/local/sbin下。
修改apache日志配置命令如下所示:
CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined
这里%w表示按照日期星期几在不同的目录下保存日志,这种方式会保存一周的日志。为了进行日志分析,需要每天将该日志文件拷贝(或移动,如果不希望保存一周的日志)到一个固定的位置以方便日志分析统计文件进行处理,实用crontab –e,如下添加定时任务:
5 0 * * * /bin/mv /www/logs/secfocus/`date -v-1d +\%w`/access_log /www/logs/secfocus/access_log_yesterday
这样再使用日志统计分析程序的对文件access_log_yesterday进行处理。
对于使用负载均衡技术的大型站点,就存在多个服务器的访问日志的合并处理问题.对于这种情况,各个服务器定义或移动日志文件时就不能使用access_log_yesterday了,就应该带上服务器编号了,例如服务器IP地址等信息以区分。然后在各个服务器上运行网站镜像和备份服务rsyncd(参考文章” 用rsync实现网站镜像和备份”,ttp://www.linuxaid.com.cn/engineer/ideal/article/rsync.htm),然后将每个服务器每天的安装配置文件通过rsync下载到专门进行访问统计分析的服务器上进行合并。
合并多个服务器的日志文件,例如:log1 log2 log3并输出到log_all中的方法是:
sort -m -t " " -k 4 -o log_all log1 log2 log3
-m: 使用 merge优化算法,-k 4表示根据时间进行排序,-o表示将排序结果存放到指定的文件中。
五、日志统计分析程序webalizer的安装和配置
webalizer是一个高效的、免费的web服务器日志分析程序。其分析结果是HTML文件格式,从而可以很方便的通过web服务器进行浏览。Internet上的很多站点都使用webalizer进行web服务器日志分析。Webalizer具有以下一些特性:
- 是用C写的程序,所以其具有很高的运行效率。在主频为200Mhz的机器上,webalizer每秒钟可以分析10000条记录,所以分析一个40M大小的日志文件只需要15秒。
- webalizer支持标准的一般日志文件格式(Common Logfile Format);除此之外,也支持几种组合日志格式(Combined Logfile Format)的变种,从而可以统计客户情况以及客户操作系统类型。并且现在webalizer已经可以支持wu-ftpd xferlog日志格式以及squid日志文件格式了。
- 支持命令行配置以及配置文件。
- 可以支持多种语言,也可以自己进行本地化工作。
- 支持多种平台,比如UNIX、linux、NT, OS/2 和 MacOS等。
上图是webalizer生成的访问统计分析报表第一页的内容,这里包含每个月的平均访问量的表格和条形图统计分析情况。点击每个月分,可以得到这个月每天的详细统计信息。
5.1 安装
在安装以前首先需要确保系统已经安装有gd库,可以使用:
[root@mail root]# rpm -qa|grep gd
gd-devel-1.8.4-4
gdbm-devel-1.8.0-14
gdbm-1.8.0-14
sysklogd-1.4.1-8
gd-1.8.4-4
来确认系统已经安装有gd-deve和gd两个rpm包。
安装webalizer有两种方式,一种是下载源代码来安装,一种是直接使用rpm包来安装。
使用rpm包方式安装非常简单,从rpmfind.net找到webalizer包,下载以后:
rpm –ivh webalizer-2.01_10-1.i386.rpm
即可实现安装。
对于源代码方式首先需要从http://www.mrunix.net/webalizer/下载,然后安装,首先解开源代码包:
tar xvzf webalizer-2.01-10-src.tgz
在生成的目录中有个lang目录,该目录中保存了各种语言文件,但是只有繁体中文版本,可以自己转换成简体,或者自己重新翻译一下。然后进入生成的目录:
cd webalizer-2.01-10
./configure
make --with-language=Chinese
make install
编译成功后,会在/usr/local/bin/目录下安装一个webalizer可执行文件。
5.2 配置和运行
对webalizer运行的控制可以通过配置文件或者在命令行指定参数的两种方式进行。而使用配置文件方式是比较简单和灵活的,适用于自动web服务器日志统计分析的应用环境。
webalizer的默认配置文件为/etc/webalizer.conf,当启动Webalizer时没有使用“-f“选项时,Webalizer就会寻找文件/etc/webalizer.conf,也可以使用“-f”来指定配置文件(当服务器有虚拟主机时,就需要配置多份不同的webalizer配置文件,不同的虚拟主机的webalizer使用不同的配置文件。Webalizer.conf配置文件中需要修改的配置选项如下:
LogFile /www/logs/secfocus/access_log
用来指示配置文件的路径信息,webalizer会将该日志文件作为输入进行统计分析;
OutputDir /www/htdocs/secfocus/usage
用来指示生成的统计报表的保存目录,在前面我们使用alias,使得用户可以使用http://www.secfocus.com/usage/来访问统计报表。
HostName www.secfocus.com
用来指示主机名,统计报表中会引用该主机名。
其他选项就无需修改,配置文件修改完毕以后,就需要在定时webalizer,每天生成当日的统计分析。
以root身份运行:crontab –e 进入定时运行任务编辑状态,加入如下任务:
5 0 * * * /usr/local/bin/webalizer –f /etc/secfocus.webalizer.conf
15 0 * * * /usr/local/bin/webalizer –f /etc/tomorrowtel.webalizer.conf
我们这里假设系统运行有两个虚拟主机,并分别定义了日志分析配置文件secfocus.webalizer.conf和tomorrowtel.webalizer.conf。这样我们定义在凌晨00:05对secfocus的日志进行统计分析;在凌晨00:15对tomorrowtel的日志进行统计分析。
然后第二天分别使用http://www.secfocus.com/usage/和http://www.tomorrowtel.com/usage来察看各自的日志分析报表。
六、保护日志统计分析报告不被未授权用户访问
我们肯定不会希望自己网站访问统计信息随意被别人浏览,因此需要将usage目录保护起来,只允许合法用户访问。这里可以采用apache自带的基本的认证机制,配置以后再连接这个地址就会需要用户提供密码才能访问该页面:
在配置文件中对目录"/"应该设置为:
DocumentRoot /www/htdocs/secfocus/
AccessFileName .htaccess
AllowOverride All
2、需求
需求:限制对http://www.secfocus.com/usage/的访问,要求用户认证才能访问。这里设置用户为"admin",口令为"12345678"。
3、使用htpasswd建立用户文件
htpasswd -c /www/.htpasswd admin
此程序会询问用户"admin"的口令,你输入"12345678",两次生效。
4、建立.htaccess文件
用vi在/www/logs/secfocus/usage/目录下建立一个文件.htaccess,写入以下几行:
AuthName admin-only
AuthType Basic
AuthUserFile /www/.htpasswd
require user admin
5、测试
这时候通过浏览器访问http://www.secfocus.com/usage就会弹出框请求输入用户名和口令,这时候输入admin、12345678就可以才可以访问访问日志统计分析报表。
(字节数 : 13217)


