多server多站点情况下awstats日志分析

多server多站点情况下awstats日志分析,第1张

多server多站点情况下awstats日志分析

场景描述:

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

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

1、如何将各个web服务器上的站点日志复制到awstats服务器上合适的位置进行处理?说起来容易,用scp或者rsync写脚本!好吧,再想想,当服务器的数量或服务器上的站点发生变化时,脚本如何仍然正确地完成任务?需要对日志名称、日志及其备份目录、日志轮换等进行统一约定。在每台服务器上,这样脚本就可以根据这个协议“适应不断的变化”。

2,一个站点必然会有多个访问日志。awstats是怎么处理的?幸运的是,awstats帮助我们解决了这个问题,awstats配置文件中关于“LogFile=”的注释已经写得很清楚了。

3、这么多站点,最好有一个统一的门户页面,并且很容易增加或减少站点的门户,方便使用。


基于以上几点,本文分享一个想法。如果有什么不对的地方,请随时告诉我。

文章分为四个部分:前提和协议;Aws配置点和FastCGI配置;集中展示页面(JavaScript实现);日志收集和处理脚本


一、前提和协议

先看看我的约定(其实有些约定即使在本文之外也是必要的,比如1和2。脚本的正常 *** 作取决于这些约定):

1、日志命名:比如www.access.log访问日志命名为www.access.Log;;日志存储位置:当前日志存在于/nginx_log目录中,日志备份存储在/nginx_log/backup中。看下图就一目了然了。

2、日志轮换:我的web服务器是nginx,通过日志切割脚本自动重新生成0点的日志,将旧的日志文件移动到日志备份目录下,后缀为前一天的日期(例如“p_w_picpaths.access.Log.2015-12-02”)。

查看日志切割脚本(在每个web服务器上于0:00执行)

卡特彼勒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天的备份

3、每天早上自动完成这一系列任务,最新的页面可以显示昨天的分析结果。

4、每个站点日志文件拉到awstats服务器后的存储形式


5、awstats服务器对所有相关的web服务器设置无密钥登录,从而拉取日志。

二。awstats配置点和FastCGI模式配置

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

Awstats可以通过两种方式显示分析结果:一种是通过命令行生成html格式的分析页面;另一种是通过向浏览器中的CGI网关传递参数来动态生成分析结果。

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

1、通过"perlawstats.pl-config=www.conf-output-staticlnks>:"www.html"命令生成html文件用于显示

2、web服务器调用类似“http://awstats.ABC.com/CGI-bin/awstats.pl?”通过FastGCI,config=/usr/local/services/awstats-7.4/etc/www.conf”的url在访问时会动态生成一个分析页面。

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

fastcgi模式页面如下图所示。

看看我的awstats目录,我在其中添加了三个目录,如下图所示

那么,我们来看看配置文件中需要注意的几个点:

###因为我们每一个站点的日志文件不止一份,所以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解码模块

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

各站点的配置文件存放于awstats/etc下,如www.conf,img.conf等。面对如此多的配置文件,这里写了个简单的小脚本来批量修改/生成配置文件。我们只需修改好一份配置文件,再运行该脚本即可(如,以www.conf为模板,则执行"shawstats/shells/batch_conf_file.shwww")
每个站点的配置文件都存储在awstats/etc中,如www.conf、img.conf等。面对这么多配置文件,这里有一个简单的脚本,可以批量修改/生成配置文件。我们只需要修改一个配置文件,然后运行脚本(例如,如果使用www.conf作为模板,执行“shawstats/shell/batch_conf_file.shwww”)

catawstats/shell/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;         } }

三。页面的集中显示

如果有多个域名,每次查看都要输入对应的一串网址,一定很麻烦。这里用html和JavaScript写了一个小页面,所有域名的条目都分组在一起,如下图所示。

index.html文件的内容如下(如果站点有增减,在js的vhost数组中增减即可)

<html> <head> <title>源站日志分析</title> <style type="text/css">      .wrap{         width:1200px;         margin:5px auto;         border:0 solid #000;     }     table {         width:660px;         margin:5px auto;         border:2px solid #E0E0E0;         background-color:#F0F0F0;         border-collapse:collapse;     }     td {         width:220px;         height:45px;         font-size:1.1em;         text-align:center;         border:0 solid #2894FF;     }     h1 {text-align:center;color:#0072E3;font-family:"Microsoft YaHei",SimSun,BiauKai;}     a {text-decoration:none;color:#0072E3;}     a:hover{color:#FF5809} </style> </head> <body>     <div class="wrap">         <h1>源站日志分析平台</h2>         <script type="text/javascript">             //域名数组,需要添加或删除域名只需在这里修改即可,会自动为其设置对应的超链接               var vhost=[                 "www.abc.com",                 "m.abc.com",                 "news.abc.com",                 "static.abc.com",                 "p_w_picpaths.abc.com",                 "bbs.abc.com",                 "i.abc.com",                 "interface.abc.com",                 "open.abc.com",                            ];             var num=vhost.length;    //域名数量             var j=101;    //j为行id,100为了避免跟单元格id重复而随意指定                        //利用JavaScript创建表格             for (var i=1;i<=num;i++) {                          if (i==1) {                     document.write("<table><tr id="101"><td id="1" onmouseover="chg_td_bgcolor()">");                 }                             else if (i==num) {document.write("<td id="" + num + "" onmouseover="chg_td_bgcolor()"></td></tr></table>")}                  else if (i%3==0) {                     j++;    //每三个单元格一个新行,行号加一                     document.write("<td id=""+ i +"" onmouseover="chg_td_bgcolor()">"+ i +"</td>");                     document.write("</tr><tr id=""+j +"">");                 }                                 else {document.write("<td id=""+ i +"" onmouseover="chg_td_bgcolor()">"+ i +"</td>");}             }              //向表格填充内容             for (var tdid=0;tdid<num;tdid++) {                 //依顺序获取各td元素                 var tdnode=document.getElementById(tdid+1);                 //取出每个域名里的主机名,服务器端awstats该站点配置文件命名方式为 “主机名.conf”                 var hostname=vhost[tdid].split(".abc",1);                 //向表格插入域名并且设置超链接,config文件的位置各位自行设置                 tdnode.innerHTML="<a href="cgi-bin/awstats.pl?config=/usr/local/services/awstats-7.4/etc/"+hostname+ ".conf">" +vhost[tdid] +"</a>";             }                          //设置table行背景色             for (var x=101;x<=j;x++){                 var row=document.getElementById(x);                 if (x%2==0) {                     row.style.background="#E0E0E0";                 }             }             //连接在新窗口打开             var allLinks=document.getElementsByTagName("a");             for(var i=0;i!=allLinks.length; i++){                 allLinks[i].target="_blank";             }         </script>     </div> </body> </html>

四。日志收集和处理

在这里,我在awstats服务器上写了一套shell脚本,实现了无论web服务器上运行的是哪些站点,只要告诉脚本服务器的ip,将服务器上所有的站点日志复制到本机适当的位置进行分析即可。每台服务器的Ip信息都记录在“/root/shell/IPS.txt”中,每条记录一行,比如“web1-192.168.1.1”

看脚本内容,脚本中的注释应该已经很详细了

catawstats/shell/CP_logs_for_awstats.sh

#!/bin/sh log_dir_s=/nginx_log/backup                #各台server日志文件源目录 log_dir_d=/nginx_log/log_analyze           #定义将日志在本地后的最终存放路径 time1=`date -d "1 day ago" +%F`            #获取一天前的日期 time2=`date -d "2 day ago" +%F` basedir=/usr/local/services/awstats-7.4    #awstats目录 echo -e "`date`  开始拉取日志\n" >$basedir/logs/cron.log ###ips.txt记录需要统计日志的所有server的hostname和ip.若增加web server,只需在该文件添加新server的记录如“web1-192.168.1.1”即可 for server_ip in `cat /root/shells/ips.txt`; do     ip=`echo $server_ip|awk -F '-' '{print $2}'`   #获取各server IP          echo -e "\e[1;32m \nrsync logs from $ip\e[0m" >>$basedir/logs/cron.log     ###将该ip下的所有前一天的access日志拷贝至本地/tmp下     rsync -avz --compress-level=6 --exclude="default.*" --min-size=1k $ip:$log_dir_s/*access*"$time1" /tmp/     if [ $? != 0 ];then    #检查rsync命令执行成功与否          echo -e "\e[1;31m \nrsync logs from $ip seems wrong!\e[0m" >>$basedir/logs/cron.log     fi     ###取得上一天的日志备份文件名 log_name     for log_name in `cd /tmp/;ls *.access.log*`; do         vhost_name=`echo $log_name|awk -F.access '{print $1}'`    #取得web server的vhost名         echo -e "\e[1;32m ----------处理$vhost_name日志----------\e[0m"                  ###在本地建立目录分类存放cp过来的日志         if [ ! -d "$log_dir_d/$vhost_name" ];then             mkdir $log_dir_d/$vhost_name         fi         rm -f $log_dir_d/$vhost_name/*"$time2"*         ###从tmp下依次mv日志文件到目标目录,以日志所在server的ip为后缀         mv /tmp/$log_name  $log_dir_d/$vhost_name/$log_name.$ip                        ###在swstats目录下建立目录用于存放awstats.pl处理日志生成的“中间文件”         if [ ! -d "$basedir/result/$vhost_name" ];then             mkdir $basedir/result/$vhost_name         fi             done done echo -e "`date`  拉取日志完成\n" >>$basedir/logs/cron.log

上面的shell脚本只是将分散在各个web服务器的日志文件按照规则拉到特定的本地目录下,下一个shell脚本用来调用awstats.pl循环处理各个站点的日志。

catawstats/shell/cron_awstats_update.sh

#!/bin/sh #awstats日志分析 basedir=/usr/local/services/awstats-7.4 cd $basedir #循环更新所有站点日志统计信息 echo -e "\e[1;31m-------`date "+%F %T"`    开始处理---------\n\e[0m" >>logs/cron.log for i in `ls result/` do    echo -e "\e[1;32m -----`date "+%F %T"`  处理 $i 日志-----\e[0m" >>logs/cron.log    perl wwwroot/cgi-bin/awstats.pl -config=etc/$i.conf -lang=cn -update &>>logs/cron.log done echo -e "\e[1;31m\n-------`date "+%F %T"`  处理完成---------\e[0m" >>logs/cron.log

这两个脚本作为计划任务在awstats服务器上运行,我的crontab如下所示

#日志分析平台 5 0 * * * /bin/bash /root/shells/cp_logs_to_img2_for_awstats.sh ; /bin/bash /root/shells/cron_awstats_update.sh

至此,这样一套东西就完成了。


写了这么多,希望已经说清楚了。看到这里的伙伴,希望能帮到你一点!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/779655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存