今天在 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 版,编译:
#cd cronolog-1.6.2
#./configure
#make
就是在 Apache 默认的 combined 格式的最前面加了 %v 以区别不同的虚拟主机访问。如果该 Web 服务器没有设置虚拟主机的话,%v 出来的将是星号(*)。查了 Apache 手册后,没找到能反映 HTTP/1.1 协议中 Host 字段所对应的变量。为了能和其他日志格式兼容,我用了个笨办法——直接将该服务器所对应的域名写在里面,于是,没有设置虚拟主机的 Appache 的日志格式成了类似:
重起 Apache,OK。
随后要做的是每天定时将前一天的 Log 发送到日志分析服务器,并删除五天前的那份 Log:
10 1 * * * /bin/rm -f /var/log/httpd/`date --date "5 days ago" +\%w`.log
到此,Apache 分割、轮巡,定时发送、删除日志的工作就做好了。
合并日志
现在日志分析服务器上已经有全部完整的、按日期精确分割的 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 相同目录下,内容大致如下:
# 各自配置
SiteDomain="lib.verycd.com" # 主机名
HostAliases="www.verycd.com" # 主机别名
将 wwwroot 目录下所有文件复制到网站的某个目录,例如,/log。在 Apache 中开放 awstats.pl 所在目录的 ExecCGI 权限:
<Directory /var/hosts/com/verycd/lib/log>
Options +ExecCGI
</Directory>
另外,如果访问是500错误的话,修改 awstats.pl 的权限试试看。
接下去是设置定时分析日志:
- 新建一个脚本文件 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 - #crontab -u root -e
- 每天 3:30 执行这个脚本30 3 * * * /bin/sh /var/local/bin/crontab/update_sites_logs.sh
Demo
VeryCD 的访问统计可见 http://www.verycd.com/log/