Kros Dai’ Blog No excuse, no panic

Apache日志轮巡/合并/分析

  今天在 VeryCD 服务器上设置了访问日志的轮巡、合并、分析。

VeryCD 目前的网页服务器配置结构

  • 1 台 MySQL 数据库 + NFS 文件服务器,无域名指向,定义为 host1.verycd.com;
  • 2 台静态页 + 资源搜索服务器,域名为 www.verycd.com 及 lib.verycd.com,DNS 轮巡,定义为 host2.verycd.com 及 host3.verycd.com,host3 上还有 emule.org.cn;
  • 2 台论坛服务器,域名为 bbs.verycd.com 及 blog.verycd.com,DNS 轮巡,定义为 host4.verycd.com 及 host5.verycd.com;
  • OS 均为 RedHad Linux 9,Web 服务器均为 Apache 2.0.49

构思

  上个月 VeryCD 使用的是章文嵩博士的 Linux Virtual Server 软件,该系统针对高可伸缩、高可用网络服务的需求,给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,它通过前端一个负载调度器(Load Balancer)无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是隐藏的, 客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。因此整个网站的访问统计的取样就显得很简单,只要在一台 Web 服务器上分析自己的日志就行了,其他服务器的请求就是它的一个线性分布,系数大致就是硬件的性能比。

  而现在整个网站由多个 Web 服务器 DNS 轮巡构成,网站结构对于用户是透明的,因此不能使用简单的抽样分析方法,分析日志的过程就比单个服务器的情况复杂得多。于是希望构建一套系统,能实现自动综合分析多个 Web 服务器的日志,给出准确直观的网站访问状况报告,而不是某台服务器单个的访问状况报告。

  注:千万不能将日志记录到同一个远程(NFS)文件里。如果使用远程文件系统记录日志,带来的麻烦远比你获得的方便多的多!



Apache 日志分割、轮巡

  使用 cronolog,到官方网站上下载 1.6.2 版,编译:

#tar -xzf cronolog-1.6.2.tar.gz
#cd cronolog-1.6.2
#./configure
#make
Copy 到 Apache 的 bin 目录:
#cp src/cronolog /usr/local/apache2/bin/cronolog
然后编辑 Apache 的 httpd.conf:
#vi /usr/local/apache2/conf/httpd.conf
这里我自定义了一个 LogFormat "all":
Format "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" all

就是在 Apache 默认的 combined 格式的最前面加了 %v 以区别不同的虚拟主机访问。如果该 Web 服务器没有设置虚拟主机的话,%v 出来的将是星号(*)。查了 Apache 手册后,没找到能反映 HTTP/1.1 协议中 Host 字段所对应的变量。为了能和其他日志格式兼容,我用了个笨办法——直接将该服务器所对应的域名写在里面,于是,没有设置虚拟主机的 Appache 的日志格式成了类似:

Format "bbs.verycd.com %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" all
修改 CustomLog,实现按天分割、按周轮巡:
CustomLog "|/usr/local/apache2/bin/cronolog /var/log/httpd/%w.log" all

重起 Apache,OK。

  随后要做的是每天定时将前一天的 Log 发送到日志分析服务器,并删除五天前的那份 Log:

#crontab -u root -e
每天凌晨 0:10 Copy 前一天的日志到日志分析服务器,我这就是 NFS 的路径;1:40删除旧日志:
10 0 * * * /bin/cp -f /var/log/httpd/`date -d yesterday +\%w`.log /var/hosts/com/verycd/host1.log
10 1 * * * /bin/rm -f /var/log/httpd/`date --date "5 days ago" +\%w`.log

  到此,Apache 分割、轮巡,定时发送、删除日志的工作就做好了。

合并日志

  现在日志分析服务器上已经有全部完整的、按日期精确分割的 Log 文件了,如何定时将它们合并在一起送交分析软件呢?在日志分析服务器上:

#crontab -u root -e
每天 1:30 将host2.log、host3.log、host4.log、host5.log 按照时间排序合并到 all.log:
30 1 * * *    /bin/sort -m -t : -k 2,4 -o /var/hosts/com/verycd/all.log   /var/hosts/com/verycd/host2.log  /var/hosts/com/verycd/host3.log   /var/hosts/com/verycd/host4.log   /var/hosts/com/verycd/host5.log

  完成日志合并工作。

分析日志

  由于以前只接触过 Windows 系列服务器,因此我已经习惯使用跨平台的 AwStats 分析日志,那还是继续使用吧。在官方网站上就有下载,有 tgz 包和 rpm 安装包,还有 For Win32 的 .exe 安装程序……安装我这就不多说了,只是需要 Perl > 5.0。

  使用也非常简便,只要按照他的设置修改几处地方即可,修改 awstats.model.conf:

  • LogFile="/var/hosts/com/verycd/all.log"
  • LogFormat= "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
  • DirData="./data" # 分析好的数据存放的路径,可以是系统的绝对路径,也可以是相对于 awstats.pl 的相对路径,需要手动建立,并赋予 0777 属性
  • 其他参数默认即可,每个参数配置文件里都有详细解释,耐心的话一会儿就能都基本理解了。

  新建 awstats.lib.verycd.conf awstats.bbs.verycd.conf awstats.emule.org.cn.conf 等配置文件(awstats.自定义配置名称.conf),保存于 awstats.pl 相同目录下,内容大致如下:

Include "awstats.model.conf" # 引入主配置文件,共享参数
# 各自配置
SiteDomain="lib.verycd.com" # 主机名
HostAliases="www.verycd.com" # 主机别名

  将 wwwroot 目录下所有文件复制到网站的某个目录,例如,/log。在 Apache 中开放 awstats.pl 所在目录的 ExecCGI 权限:

AddHandler cgi-script .cgi .pl
<Directory /var/hosts/com/verycd/lib/log>
    Options +ExecCGI
</Directory>

  另外,如果访问是500错误的话,修改 awstats.pl 的权限试试看。

  接下去是设置定时分析日志:

  1. 新建一个脚本文件 uodate_sites_logs.sh,内容大致如下:
    /usr/bin/perl /var/hosts/com/verycd/lib/log/awstats.pl -config=lib.verycd.com -update=1
    /usr/bin/perl /var/hosts/com/verycd/lib/log/awstats.pl -config=blog.verycd.com -update=1
    /usr/bin/perl /var/hosts/com/verycd/lib/log/awstats.pl -config=emule.org.cn -update=1
    /usr/bin/perl /var/hosts/com/verycd/lib/log/awstats.pl -config=dl1.emule.org.cn -update=1
    /usr/bin/perl /var/hosts/com/verycd/lib/log/awstats.pl -config=bbs.verycd.com -update=1
  2. #crontab -u root -e
  3. 每天 3:30 执行这个脚本
    30 3 * * * /bin/sh /var/local/bin/crontab/update_sites_logs.sh

Demo

  VeryCD 的访问统计可见 http://www.verycd.com/log/

参考文档:


This site is licensed under a Creative Commons License .