Web服务器日志统计分析完全解决方案
from:http://kunming.cyberpolice.cn/aqjs/20004.html |
摘要 对于所有的ICP来说,除了保证网站稳定正常运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,对提高各个网站的服务能力和服务水平是必不可少的。通过对Web服务器的日志文件进行分析和统计,能够有效掌握系统运行情况以及网站内容的受访问情况、加强对整个网站及其内容的维护与管理。本文对Web服务器日志分析的原理和技术进行讨论。(2003-04-03 13:26:53) -------------------------------------------------------------------------------- By ideal http://www.linuxaid.com.cn/
关键字:web服务器 日志 统计分析 crontab cronolog apache 摘要:对于所有的ICP来说,除了保证网站稳定正常运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,对提高各个网站的服务能力和服务水平是必不可少的。通过对Web服务器的日志文件进行分析和统计,能够有效掌握系统运行情况以及网站内容的受访问情况、加强对整个网站及其内容的维护与管理。本文对Web服务器日志分析的原理和技术进行讨论。 文章相关软件: webalizer http://www.mrunix.net/webalizer/ 一、 前言 管理Web网站不只是监视Web的速度和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 可以看到,在客户机的请求里包含了很多有用的信息,例如:客户端类型等等。而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)" 从上面的日志文件可以看出日志记录会记录客户端的IP地址、访问发生的时间、访问请求的页面、web服务器对于该请求返回的状态信息、返回给客户端的内容的大小(以字节为单位)、该请求的引用地址、客户浏览器类型等信息。 三、apache日志的配置和管理 Apache配置文件中,我们需要关心的和日志相关的配置有两个: CustomLog /www/logs/access_log common CustomLog用来指示apache的访问日志的存放位置(这里保存在/www/logs/access_log中)和格式(这里为common);ErrorLog用来指示apache错误信息日志的存放位置。 对于不配置虚拟主机的服务器来说,只需要直接在httpd.conf中查找CustomLOg的配置进行修改即可;而对于具有多个虚拟服务器的web服务器来说,需要分离各个虚拟服务器的访问日志,以便对各个虚拟服务器进行访问统计和分析。因此这就需要在虚拟服务器配置中进行独立的日志配置,示例: NameVirtualHost 75.8.18.19
但是下来遇到的一个问题就是日志文件的轮循,因为日志是一直在增大的,如果不进行处理那么日志文件会越来越大,会影响web服务器运行效率;速率,还可能过大耗尽服务器硬盘空间,导致服务器无法正常运行,另外如果单个日志文件大于操作系统单文件尺寸的的限制,从而更进一步影响web服务的运行。而且日志文件如果不进行轮循也不变于日志统计分析程序的运行,因为日志统计分析都是以天为单位进行统计分析的,跨越很长时间日志会使得日志统计分析程序运行特别慢。因此这里就需要对web服务器日志文件每天进行轮循。 四、web服务器日志轮循 对于大型的WEB服务来说,其往往使用实用负载均衡技术提高web站点服务能力,这样后台有多个服务器提供WEB服务,这大大方便了服务的分布规划和扩展性,但多个服务器的分布就需要对日志进行合并统一进行统计分析。因此为了保证统计的精确性就需要严格按照每天的时段来自动生成日志文件。 4.1 logrotate实现日志轮循 #!/bin/sh 可以看到每天清晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循。 而在/etc/logrorate.conf中可以看到内容如下: # see "man logrotate" for details # system-specific logs may be also be configured here. 从logrotate的配置文件中可以看到除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此我们只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循web服务器的日志文件即可,下面是一个示例: /www/log/secfocus { 这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有:access_log、access_log.1、access_log.2三个日志备份文件。就这样就实现了对两个虚拟主机的日志文件的轮循。后面我们会讨论如何使用日志统计分析软件对日志文件进行处理。 这种方法的优点是不需要其他第三方工具就可以实现日志轮循,但是对于重负载的服务器和使用负载均衡技术的web服务器来说这种方法就不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。 4.2 使用apache自带的rotatelogs实现日志轮循 # compressed logs 这样就可以实用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实现日志轮循 [root@mail root]# tar xvfz cronolog-1.6.2.tar.gz 这就完成了cronolog的配置和安装,默认情况下cronolog是安装在/usr/local/sbin下。 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的安装和配置 是用C写的程序,所以其具有很高的运行效率。在主频为200Mhz的机器上,webalizer每秒钟可以分析10000条记录,所以分析一个40M大小的日志文件只需要15秒。
5.1 安装 [root@mail root]# rpm -qa|grep gd 来确认系统已经安装有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 编译成功后,会在/usr/local/bin/目录下安装一个webalizer可执行文件。 5.2 配置和运行 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 http://www.secfocus.com/ 用来指示主机名,统计报表中会引用该主机名。 其他选项就无需修改,配置文件修改完毕以后,就需要在定时webalizer,每天生成当日的统计分析。 以root身份运行:crontab –e 进入定时运行任务编辑状态,加入如下任务: 5 0 * * * /usr/local/bin/webalizer –f /etc/secfocus.webalizer.conf 我们这里假设系统运行有两个虚拟主机,并分别定义了日志分析配置文件secfocus.webalizer.conf和tomorrowtel.webalizer.conf。这样我们定义在凌晨00:05对secfocus的日志进行统计分析;在凌晨00:15对tomorrowtel的日志进行统计分析。 然后第二天分别使用http://www.secfocus.com/usage/和http://www.tomorrowtel.com/usage来察看各自的日志分析报表。 六、保护日志统计分析报告不被未授权用户访问
在配置文件中对目录"/"应该设置为: DocumentRoot /www/htdocs/secfocus/ 2、需求 需求:限制对http://www.secfocus.com/usage/的访问,要求用户认证才能访问。这里设置用户为"admin",口令为"12345678"。 3、使用htpasswd建立用户文件 htpasswd -c /www/.htpasswd admin 4、建立.htaccess文件 用vi在/www/logs/secfocus/usage/目录下建立一个文件.htaccess,写入以下几行: 5、测试 这时候通过浏览器访问http://www.secfocus.com/usage就会弹出框请求输入用户名和口令,这时候输入admin、12345678就可以才可以访问访问日志统计分析报表。 |