图片 5

多主机多站点情景下AWStats日志分析,日志分析工具Awstats实战之Nginx篇

情景描述

公司web服务器分为三个集群:前台(包括www、news、m等站点);图片(包括img、static等站点);后台(包括user、interface等站点)。这种情况下如何使用awstats进行日志分析呢?

这个需求我们很容易想到其中的几个“关键点”

  1. 如何将各台web server上的站点日志拷贝到awstats
    server上的合适位置以备处理呢?这好说,写脚本用scp或者rsync嘛!ok,再想一步,如何在server数量或者server上站点发生变化时,脚本依然能够正确的完成任务呢?这就要各server上关于日志名称、日志及其备份目录、日志轮转等方面做统一约定了,脚本按照这个约定才能“以不变应万变”。
  2. 一个站点的访问日志势必会有多份,awstats如何处理呢?还好这一点awstats已经帮我们想好了,在awstats配置文件里关于“LogFile=”部分的注释已经写得很清楚。
  3. 这么多站点,最好有一个统一的入口页面,而且增减站点入口要简单,用着才方便。

基于以上几点,本文分享一种思路,若有更优的方法,还请不吝指教。

文章分四个部分:前提及约定awstats配置要点和FastCGI方式配置集中展示页面(JavaScript实现)日志收集处理脚本

前面两篇都在讲述如何去部署nginx下的awstats日志分析工具

前言:
Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB
日志分析工具,一个充分的日志分析让 Awstats 显示您下列资料:
访问次数、独特访客人数,
访问时间和上次访问,
使用者认证、最近认证的访问,
每周的高峰时间(页数,点击率,每小时和一周的千字节),
域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),
主机名单,最近访问和未解析的 IP 地址名单
大多数看过的进出页面,
档案类型,
网站压缩统计表(mod_gzip 或者 mod_deflate),
使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),
使用的浏览器,
机器人访问(检测 319 个机器人),
蠕虫攻击 (5 个蠕虫家族),
搜索引擎,利用关键词检索找到你的地址,
HTTP 协议错误(最近查阅没有找到的页面),
其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.
贵网站被加入”最喜爱的书签”.次数.
屏幕大小(需要在索引页补充一些 HTML 标签).
浏览器的支持比例: Java, Flash, RealG2 reader, Quicktime reader, WMA
reader, PDF reader.
负载平衡服务器比率集群报告.

前提及约定

先看下我的约定(其实某些约定即使在本文之外也是很有必要的,例如1、2。脚本的正常运行依赖于这些约定):

  1. 日志命名:如www.abc.com访问日志命名为www.access.log;日志存放位置:当前的日志存在于/nginx_log目录,日志备份存储于/nginx_log/backup。看下图就一目了然了
    图片 1
  2. 日志轮转:我的web
    server为nginx,通过日志切割脚本自动在0点重新生成日志,并将旧日志文件以前一天的日期为后缀命名(例如“images.access.log.2015-12-02”)移动到日志备份目录。

    看下日志切割脚本(在每台web server定时0点执行)
    cat rotate_nginx_logs.sh

    #!/bin/sh

    logs_path="/nginx_log"    ###日志存放路径
    logs_bak_dir="/nginx_log/backup"    ###日志备份目录
    yesterday=`date -d "1 day ago" +%`
    pid_file=`cat /usr/local/nginx/nginx.pid`    ###nginx pid 文件

    cd $logs_path
    for log in `ls *.log`;do
        mv $log $logs_bak_dir/$log.$yesterday
    done    ###重命名日志文件
    kill -USR1 $pid_file    ###告知nginx重新生成日志

    cd $logs_bak_dir
    find . -mtime +5|xargs rm -f    ###删除backup目录下超过5天的备份
  1. 每天凌晨自动完成这一系列任务, 页面最新可显示昨日的分析结果

  2. 各站点日志文件拉取到awstats server后的存储形式
    图片 2
    图片 3

  3. awstats server设置对所有相关web server的免秘钥登陆,以便拉取日志

日志分析工具Awstats实战之Nginx篇:分析结果静态化
http://www.linuxidc.com/Linux/2013-10/92150.htm

Awstats 的运行是需要 PERL 环境的支持,从 awstats 的文档来看,它对 Apache
HTTP Server 的支持是非常完美的,而当我们把 Web 服务器换成 Nginx
后,要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl
的支持是比较弱的,甚至官方也不建议使用;另外在日志格式上有需要修改后才能运行。
使用awstats可以分析apache日志,同样也可以分析nginx日志。本文将详细介绍自动定时切割nginx的访问日志,并使用awstats来定时分析nginx日志及实现统计结果可供安全便捷的查阅。

awstats配置要点和FastCGI方式配置

这里不展开详细的安装步骤,只说明一些配置选项以及如何配置动态模式。

日志分析工具Awstats实战之Nginx篇:分析结果动态化
http://www.linuxidc.com/Linux/2013-10/92150p2.htm

环境:
CentOS 6.4 x86_64
ip:192.168.1.113
域名:www.linuxidc.com(server和client都通过hosts文件解析)
nginx-1.2.9 编译安装,路径/usr/local/nginx,服务开启状态
日志记录格式为nginx默认的,切勿更改,否则会造成awstats无法分析日志。
log_format  main  ‘$remote_addr – $remote_user [$time_local]
“$request” ‘
                  ‘$status $body_bytes_sent “$http_referer” ‘
                  ‘”$http_user_agent” “$http_x_forwarded_for”‘;
awstats-7.2.tar.gz

awstats有两种方式展示分析结果:

一种是命令行生成html格式的分析页面;另一种是在浏览器通过向CGI网关传递参数来动态生成分析结果。

其实在原理上,这两种形式都需要“perl awstats.pl -config=mysite.conf
-update”命令定时更新生成指定站点的“数据文件”(即经过awstats.pl分析日志生成的中间文件),然后可以分两种方法(对中间文件进行处理)生成我们看到的分析页面:

  1. 通过“perlawstats.pl -config=www.conf -output -staticlinks >
    www.html”命令生成html文件用于展示
  2. web服务器通过FastGCI调用类似“”的url在访问时动态生成分析页面

两种方式各有优缺:第一种定时生成html文件,访问时页面加载快,但是页面布局使用起来不方便也不美观;第二种在打开页面时需要临时处理“数据文件”生成html,页面加载速度根据“数据文件”大小不同会有不同程度延迟,但是动态形式的页面布局看着舒服用着顺手(所以我选择fastcgi模式)。

fastcgi模式页面如下图所示
图片 4

现在终于轮到apache。作为老牌的网页服务器,awstats对apache的支持非常完美,所以整个配置过程也是十分简单。因此,在这里我就拓展了一下部署,实现了对多站点的日志分析功能。

一、日志自动切割
对于nginx的日志切割,由于没有像apache一样去用cronolog工具,这里我们就写一个脚本,让它可以在每天00:01自动执行,切割昨天的日志(交由awstats分析),压缩前天的日志(压缩日志可减小存储空间,为防止awstats没有分析完就被压缩,所以只压缩前天的日志)。

来看下我的awstats目录,其中我增加了三个目录,如下图

图片 5

注意:自本篇博文发表之日,apache-2.4.x还是无法支持部署awstats日志分析结果访问动态化,不过可以用前篇日志分析工具Awstats实战之Nginx篇-分析结果静态化中讲到的方法来实施部署awstats。因此,本篇博文将用apache2.2.25版本来为大家讲解如何部署awstats日志分析结果动态化及多站点。
环境:

vim /server/scripts/cut_nginx_log.sh

然后来看下配置文件里需要注意的几个地方:

###因为我们每一个站点的日志文件不止一份,所以LogFile必须按照以下模式配置
LogFile="/usr/local/services/awstats-7.4/tools/logresolvemerge.pl /nginx_log/log_analyze/www/*.log* |"
###DirData按照上图所示,存储于result下,例如 result/www  result/img等
DirData="/usr/local/services/awstats-7.4/result/www"
###DirCgi="/awstats"    将此行注释掉

LoadPlugin="decodeutfkeys"    ###将此行的注释打开。否则页面“搜索关键字”可能乱码

同时yum install perl-String-Escape perl-URI-Encode
安装perl字符及URL解码模块

CentOS 6.4 x86_64
ip:192.168.1.113
站点1:域名www.linuxidc.com(server和client都通过hosts文件解析)
站点2:域名www.88181.com(server和client都通过hosts文件解析)
apache-2.2.25 编译安装,路径/usr/local/apache,服务开启状态
日志记录格式为apache默认的combined格式,切勿更改,否则会造成awstats无法分析日志。
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\”
\”%{User-Agent}i\”” combined
apr-1.4.8  apr-util-1.5.2
awstats-7.2.tar.gz

输入以下内容:

然后再看“配置文件”的生成管理

各站点的配置文件存放于awstats/etc下,如www.conf,img.conf等。面对如此多的配置文件,这里写了个简单的小脚本来批量修改/生成配置文件。我们只需修改好一份配置文件,再运行该脚本即可(如,以www.conf为模板,
则执行”sh awstats/shells/batch_conf_file.sh www”)
cat awstats/shells/batch_conf_file.sh

#!/bin/sh
###批量建数据目录,批量 创建各域名配置文件
cd /usr/local/services/awstats-7.4
for i in `ls result`    #这一步需下文的日志收集脚本执行完,在result目录下生成了各站点目录才能正确执行
do
    if [ $1 != $i ];then
        echo -e "\n------ create $i.conf -------"
        rsync -a etc/$1.conf etc/$i.conf
        echo -e "------replace $1 by $i -------"
        sed -i "/^[^#].*/ s/$1/$i/g" etc/$i.conf
    fi
done

最后来看fastcgi模式的配置

  1. 在tools/nginx/目录下有相关文件
  2. 将tools/nginx/awstats-fcgi.php 拷贝至wwwroot/cgi-bin/fcgi.php
  3. 修改tools/nginx/awstats-nginx.conf
    文件相关配置,并在nginx主配置文件里面引用该文件

    server {
        listen 80;
        server_name awstats.abc.com;
        root /usr/local/services/awstats-7.4/wwwroot;
       #charset utf8;
        index index.html;
    
                # Static awstats files: HTML files stored in DOCUMENT_ROOT/awstats/
        location /awstats/classes/ {
                alias /usr/local/services/awstats-7.4/wwwroot/classes/;
        }
        location /awstats/css/ {
                alias /usr/local/services/awstats-7.4/wwwroot/css/;
        }
        location /awstats/icon/ {
                alias /usr/local/services/awstats-7.4/wwwroot/icon/;
        }
        location /awstats-icon/ {
                alias /usr/local/services/awstats-7.4/wwwroot/icon/;
        }
        location /awstats/js/ {
                alias /usr/local/services/awstats-7.4/wwwroot/js/;
        }
        # Dynamic stats.
        location ~ ^/cgi-bin/(awredir|awstats)\.pl {
                gzip off;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root/cgi-bin/fcgi.php;
                fastcgi_param X_SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param X_SCRIPT_NAME $fastcgi_script_name;
                include fastcgi_params;
                #下面这三行酌情设置。太小可能会导致页面“链接被重置”
                fastcgi_connect_timeout 300;
                fastcgi_send_timeout 300;
                fastcgi_read_timeout 300;
        }
    }
    

一、日志自动切割
由于apache自带的日志轮询工具rotatelogs,据专家说在进行日志切割时容易丢日志,所以这里我们就用cronolog来做日志切割。
1、下载并安装cronolog

#!/bin/sh
yesterday=`date -d “yesterday” +”%Y%m%d”`
before_yesterday=`date -d “-2 day” +”%Y%m%d”`
Nginx_Dir=”/usr/local/nginx”
Nginx_logs=”/app/logs”
Log_Name=”www_access”
cd /tmp
[ -d $Nginx_Logs ] && cd $Nginx_logs || exit 1
[ -f $Log_Name.log ] && /bin/mv $Log_Name.log
${Log_Name}_${yesterday}.log || exit 1
if [ $? -eq 0 -a -f $Nginx_Dir/logs/nginx.pid ]
    then
      kill -USR1 `cat $Nginx_Dir/logs/nginx.pid`
fi
[ -f  ${Log_Name}_${before_yesterday}.log ] && /usr/bin/gzip
${Log_Name}_${before_yesterday}.log|| exit 1