管理Web网站不只是监视Web的速度和Web的内容传送。它不但要关注服务器每天的吞吐量,还要了解这些Web网站的外来访问,了解网站各页面的访问情况。根据各页面的点击频率来改良网页的内容和质量,提高内容的可读性,和跟踪包括有商业交易的步骤及管理Web网站“幕后”的数据等。
为了更好地提供WWW服务,监控Web服务器的运行情况、了解网站内容的详细访问状态就显得愈来愈重要和迫切了。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。本文将对Web服务器日志分析的原理和技术进行讨论。
文章内相干工具软件下载地址以下:
Webalizerhttp://www.mrunix.net/webalizer/
Cronolog http://www.cronolog.org/
Apache http://www.apache.org/
网站服务器日志记录了Web服务器接收处理要求及运行时毛病等各种原始信息。通过对日志进行统计、分析和综合,就可以有效地掌握服务器的运行状态、发现和排除毛病缘由、了解客户访问散布等,更好地加强系统的保护和管理。
WWW服务模型非常简单:
1.客户端(阅读器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问要求(如get)。根据HTTP协议,该要求中包括了客户真个IP地址、阅读器的类型、要求的URL等1系列信息。
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)多。下面是common类型的日志示例:
218.242.102.121 - -[06/Dec/2002:00:00:00 +0000] "GET
/2/face/shnew/ad/via20020915logo.gifHTTP/1.1" 304 0 "http://www.mpsoft.net/"
"Mozilla/4.0 (compatible; MSIE6.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.gifHTTP/1.1" 304 0 "http://www.mpsoft.net/"
"Mozilla/4.0 (compatible; MSIE5.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; MSIE5.5; Windows NT 5.0)"
从上面的日志文件可以看出,日志记录会记录客户真个IP地址、访问产生的时间、访问要求的页面、Web服务器对该要求返回的状态信息、返回给客户真个内容的大小(以字节为单位)、该要求的援用地址、客户阅读器类型等信息。
本文中假定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/"
这里需要注意的是,每一个虚拟主机的定义都有1个CustomLog命令,用来指定该虚拟主机访问日志的寄存文件;而Alias命令用来让日志分析生成的报表能通过www.secfocus.com/usage/的方式来访问。通过上面的配置就完成了日志文件的保存。
接下来遇到的1个问题就是日志文件的轮循。由于日志1直在增大,如果不进行处理那末日志文件愈来愈大,就会影响Web服务器运行效力、速率,还可能耗尽服务器硬盘空间,致使服务器没法正常运行。另外,如果单个日志文件大于操作系统单文件尺寸的的限制,从而会进1步影响Web服务的运行。而且,日志文件如果不进行轮循,也不便于日志统计分析程序的运行。由于日志统计分析都是以天为单位进行统计分析的,逾越很长时间日志会使得统计分析程序运行特别慢。因此这里就需要对Web服务器日志文件每天进行轮循。
Web服务器日志轮循比较好的方式有3种:第1种方法是利用Linux系统本身的日志文件轮循机制logrotate;第2种方法是利用Apache自带的日志轮循程序rotatelogs;第3种是使用在Apache的FAQ中推荐发展已比较成熟的1个日志轮循工具 cronolog。
对大型的Web服务来讲,常常使用实用负载均衡技术提高Web站点服务能力,这样后台有多个服务器提供Web服务,大大方便了服务的散布计划和扩大性。如果有多个服务器的散布需要对日志进行合并,统1进行统计分析。因此为了保证统计的精确性,需要严格依照每天的时段来自动生成日志。
首先讨论采取Linux系统本身的日志文件轮循机制logrotate的方法。logrotate是Linux系统本身带的1个日志轮循程序,是专门对各种系统日志(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" fordetails
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files afterrotating old ones
create
# uncomment this if you want your logfiles compressed
#compress
# RPM packages drop log rotationinformation into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotatethem here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also beconfigured here.
从 logrotate的配置文件中可以看到,除wtmp之外,需要转动的日志的配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建1个名为apache的配置文件,来唆使logrotate如何轮循Web服务器的日志文件便可。下面是1个示例:
/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.23个日志备份文件。这样就实现了对两个虚拟主机的日志文件的轮循。本文后面会讨论如何使用日志统计分析软件对日志文件进行处理。
这类方法的优点是不需要其它第3方工具就能够实现日志轮循。但是对重负载的服务器和使用负载均衡技术的Web服务器来讲,这类方法不是很实用。由于它是对相应服务进程发出1个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。
用rotatelogs实现日志轮循
Apache 提供了不把日志直接写入文件,而是通过管道发送给另外1个程序的能力。这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任何程序,如日志分析、紧缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部份的内容替换为“|程序名”便可,例如:
# 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秒(1天)对日志进行1次轮循。轮循以后的文件名为 /www/logs/secfocus/access_log.nnn,这里nnn是开始记录日志的时间。因此,为了将日志按天对齐需要在清晨00:00 启动服务,使得每天轮循得到的日志恰好是完全1天的日志,以提供给访问统计分析程序进行处理。如果是00:00开始生成新的日志,那末轮循得到的日志就是 access_log.0000。
首先需要下载和安装cronolog,可以到http://www.cronolog.org下载最新版本的cronolog。下载终了以后,解压安装便可。方法以下所示:
tar xvfz cronolog⑴.6.2.tar.gz
cd cronolog⑴.6.2
./configure
make
make check
make install
这样就完成了cronolog的配置和安装,默许情况下cronolog是安装在/usr/local/sbin下。
修改Apache日志配置命令以下所示:
$ CustomLog"|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined
这里%w表示依照日期在不同的目录下保存日志,这类方式会保存1周的日志。
为了进行日志分析,需要每天将该日志文件拷贝(或移动,如果不希望保存1周的日志)到1个固定的位置,以方便日志分析统计文件进行处理(使用crontab -e)。添加定时任务以下:
$ 5 0 * * * /bin/mv/www/logs/secfocus/`date -v⑴d +\%w`/access_log
/www/logs/secfocus/access_log_yesterday
再使用日志统计分析程序,对文件access_log_yesterday进行处理。
对使用负载均衡技术的大型站点,就存在多个服务器的访问日志的合并处理问题。对这类情况,各个服务器定义或移动日志文件时就不能使用 access_log_yesterday了,而应当带上服务器编号(例如服务器IP地址等信息)加以辨别。然后在各个服务器上运行网站镜像和备份服务 rsyncd,再将每一个服务器每天的安装配置文件通过rsync下载到专门进行访问统计分析的服务器上进行合并。
合并多个服务器的日志文件(如log1、log2、log3),并输出到log_all中的方法是:
$ sort -m -t " " -k 4 -olog_all log1 log2 log3
-m表示使用merge优化算法;-k 4表示根据时间进行排序;-o表示将排序结果寄存到指定的文件中。
webalizer是1个高效、免费的Web服务器日志分析程序。其分析结果是HTML文件格式的,从而可以很方便地通过Web服务器进行阅读。Internet上的很多站点都使用webalizer进行Web服务器日志分析。Webalizer具有以下1些特性。
◆ 它是用C语言写的程序,具有很高的运行效力。在CPU主频为200MHz的机器上,webalizer每秒钟可以分析1万条记录,所以分析1个40MB大小的日志文件只需要15秒。
◆ webalizer支持标准的1般日志文件格式(Common Logfile Format)。除此以外,也支持几种组合日志格式的变种,从而可以统计客户情况及客户操作系统类型。现在webalizer已可以支持wu-ftpd xferlog日志格式及squid日志文件格式。
◆ 支持命令行配置及配置文件。
◆ 可以支持多种语言,也能够自己进行本地化工作。
◆ 支持多种平台,比如Unix、Linux、NT、OS/2和MacOS等。
webalizer生成的访问统计分析报表里面包括每月的平均访问量的表格和条形图统计分析情况。点击每月份,可以得到这个月每天的详细统计信息。
1.安装
在安装之前,首先需要确保系统已安装有gd库,可使用下段代码:
# rpm -qa|grep gd
# gd-devel⑴.8.4⑷
# gdbm-devel⑴.8.0⑴4
# gdbm⑴.8.0⑴4
# sysklogd⑴.4.1⑻
# gd⑴.8.4⑷
用来确认系统已安装有gd-deve和gd两个RPM包。
安装webalizer有两种方式:1种是下载源代码来安装;1种是直接使用RPM包来安装。
使用RPM包方式安装非常简单,从rpmfind.net找到webalizer包,下载以后运行以下代码,便可实现安装:
$ rpm -ivh webalizer⑵.01_10⑴.i386.rpm
对源代码方式需要从http://www.mrunix.net/webalizer/下载,然后安装。首先解开源代码包:
$ tar xvzf webalizer⑵.01⑴0-src.tgz
在生成的目录中有个lang目录。该目录中保存了各种语言文件,但是只有繁体中文版本,可以自己转换成简体,或重新翻译1下,然落后入生成的目录:
$ cd webalizer⑵.01⑴0
$ ./configure
$ make --with-language=Chinese
$ make install
编译成功后,会在/usr/local/bin/目录下安装1个webalizer可履行文件。
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的日志进行统计分析。
第2天分别使用http://www.secfocus.com/usage和http://www.tomorrowtel.com/usage来查看各自的日志分析报表。
保护日志统计分析报告不被未授权用户访问
我们都不希望自己网站访问统计信息随便被他人阅读,因此需要将usage目录保护起来,只允许合法的用户访问。这里可以采取Apache自带的基本认证机制。配置以后再连接这个地址需要用户提供密码才能访问该页面(如图3所示)
1.条件
在配置文件中对目录“/”应当设置为:
DocumentRoot /www/htdocs/secfocus/
AccessFileName .htaccess
AllowOverride All
2.需求
需求是限制对http://www.secfocus.com/usage/的访问,要求用户认证才能访问。这里设置用户为“admin”,口令为“12345678”。
使用htpasswd建立用户文件:
$ htpasswd -c /www/.htpasswd admin
此程序会询问用户“admin”的口令,输入“12345678”两次生效。
3.建立.htaccess文件
用vi在/www/logs/secfocus/usage/目录下建立1个文件.htaccess,写入以下几行代码:
AuthName admin-only
AuthType Basic
AuthUserFile /www/.htpasswd
require user admin
测试
通过阅读器访问http://www.secfocus.com/usage,就会弹出框要求输入用户名和口令,输入“admin”、“12345678”就能够访问访问日志统计分析报表。
http://server.it168.com/a2009/0624/595/000000595027_3.shtml