本文可视为多服务器多站点情况下awstats日志分析的下篇文章。在使用过程中发现awstats在cgi模式下动态生成分析报告(特别是一些站点,每天有两个以上的日志,简直考验人的耐心)。本文分享一个改进这一缺点的思路。
Processlogs:Building/updatingstatisticsdatabase,建立/更新统计数据库(包含统计结果的文本文件)命令如下
perlawstats.pl-config=mysite-update
Runreports:Buildingandreadingreports(生成并阅读报告)
1.Thefirstoptionistobuildthemainreports,inastaticHTMLpage,fromthecommandline,usingthefollowingsyntax
第一种方式,通过命令行生成html文件,然后浏览器展示。命令如下
perlawstats.pl-config=mysite-output-staticlinks>awstats.mysite.html
2.Thesecondoptionistodynamicallyviewyourstatisticsfromabrowser. Todothis,usetheURL:
第二种方式,通过如下的url“动态”的生成该站点的分析报告
http://www.myserver.mydomain/awstats/awstats.pl?config=mysite
有了想法,接下来就是“尝试”和“分析特性”了。我们直接
curl -o /tmp/mysite.html http://www.myserver.mydomain/awstats/awstats.pl?config=mysite获得的页面源代码如下
<html > <head> <meta name="generator" content="AWStats 7.4 (build 20150714) from config file awstats./usr/local/awstats/etc/www.conf.conf (http://www.awstats.org)"> <meta name="robots" content="noindex,nofollow"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="expires" content="Wed Apr 27 11:09:58 2016"> <meta http-equiv="description" content="Awstats - Advanced Web Statistics for www.dddd.com (2015-08) - main"> <title>Statistics for www.mysite.com (2015-08) - main</title> </head> <frameset cols="240,*"> <frame name="mainleft" src="awstats.pl?config=mysite&framename=mainleft" noresize="noresize" frameborder="0" /> <frame name="mainright" src="awstats.pl?config=mysite&framename=mainright" noresize="noresize" scrolling="yes" frameborder="0" /> <noframes><body>Your browser does not support frames.<br /> You must set AWStats UseFramesWhenCGI parameter to 0 to see your reports.<br /> </body></noframes> </frameset> </html>可以看出,动态生成的页面实际上是一个包含两个框架(mainleft和mainright)的html文件。也就是说,如果我们要还原一个动态生成的报表页面,需要通过下面三个命令生成三个对应的文件。
curl -s -o main.html "http://www.myserver.mydomain/awstats/awstats.pl?config=mysite" #取得主页面 curl -s -o left.html "http://www.myserver.mydomain/awstats/awstats.pl?config=mysite&framename=mainleft" #取得左frame curl -s -o right.html "http://www.myserver.mydomain/awstats/awstats.pl?config=mysite&framename=mainright" #取得右frame然后,我们需要修改main.html中两个帧的src属性,mainleft和mainright,并将它们分配给我们生成的left.html和right.html。这样我们就实现了静态的动态页面(其实就是把动态生成的等待时间放到脚本里,定时执行)。
接下来是具体的实现过程,涉及到上一篇文章中“cron_awstats_update.sh”脚本的改进。修改后的脚本如下(评论相当丰富,也能帮助理解思路)
#!/bin/sh #awstats日志分析 basedir=/usr/local/awstats-7.4 date_y_m=$(date +%Y%m -d '1 day ago') #因为该脚本是第二天凌晨分析前一天的日志 year=`echo ${date_y_m:0:4}` month=`echo ${date_y_m:4:5}` 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 #将动态页面静态化,查看展示页面结构可得:主页面基本没内容,主要靠左右两个frame来生成内容 #所以可以将每一个站点的展示页分为三部分来缓存 echo -e "\e[1;32m -----`date "+%F %T"` 分析 $i 生成静态页面-----\n\e[0m" >>logs/cron.log cd wwwroot if [ ! -d $i/$date_y_m ];then mkdir -p $i/$date_y_m;fi cd $i/$date_y_m curl -s -o main.html\ #主页面 "http://127.0.0.1/cgi-bin/awstats.pl?month=$month&year=$year&output=main&config=/usr/local/services/awstats-7.4/etc/$site.conf&framename=index" curl -s -o left.html\ #左页面 "http://127.0.0.1/cgi-bin/awstats.pl?month=$month&year=$year&output=main&config=/usr/local/services/awstats-7.4/etc/$site.conf&framename=mainleft" curl -s -o right.html\ #右页面 "http://127.0.0.1/cgi-bin/awstats.pl?month=$month&year=$year&output=main&config=/usr/local/services/awstats-7.4/etc/$site.conf&framename=mainright" #修改main.html里关于左右两个frame的引用 sed -i -e 's/awstats.pl.*left/left.html/g' -e 's/awstats.pl.*right/right.html/g' main.html #接下来修改上面三个文件中的超链接部分 sed -i -e 's#awstats.pl#http://123.123.123.123/cgi-bin/awstats.pl#g'\ #123.123.123.123为公网ip -e 's/charset=.*/charset=utf-8">/g'\ -e 's/lang="cn"//g'\ main.html left.html right.html #剩下的事就是去修改nginx index.html页面的超链接指向 cd $basedir done echo -e "\e[1;33m-------`date "+%F %T"` 处理完成---------\n\e[0m" >>logs/cron.log ##### #原始请求样式, #http://127.0.0.1/cgi-bin/awstats.pl?config=/usr/local/awstats-7.4/etc/heibai.conf 这个url访问该站点最新数据,会产生下面三个请求 #http://127.0.0.1/cgi-bin/awstats.pl?config=/usr/local/awstats-7.4/etc/heibai.conf #http://127.0.0.1/cgi-bin/awstats.pl?config=/usr/local/awstats-7.4/etc/heibai.conf&framename=mainleft #http://127.0.0.1/cgi-bin/awstats.pl?config=/usr/local/awstats-7.4/etc/heibai.conf&framename=mainright ##### #选择年月之后,会产生如下三个请求 #http://127.0.0.1/cgi-bin/awstats.pl?month=05&year=2016&output=main&config=%2Fusr%2Flocal%2Fawstats-7.4%2Fetc%2Fheibai.conf&framename=index 经过编码的 #http://127.0.0.1/cgi-bin/awstats.pl?month=05&year=2016&output=main&config=/usr/local/awstats-7.4/etc/heibai.conf&framename=mainleft #http://127.0.0.1/cgi-bin/awstats.pl?month=05&year=2016&output=main&config=/usr/local/awstats-7.4/etc/heibai.conf&framename=mainright #####经过脚本处理后,wwwroot目录中的站点目录和html文件将如下所示。
至此,在对上一篇文章中的nginx配置部分做了相应的修改后,我们就可以通过下面的url进行访问和提问了
Http://www.myserver.mydomain/www/201605#表示2016年5月www站统计页面。
然而,这里的转换并没有完成。在动态生成的页面中,有一个选择年月的下拉框,可以查看指定年月的统计页面,如下图所示。
该函数将生成一个请求,如下所示
http://www.myserver.mydomain/cgi-bin/awstats.pl?month=04&;年份=2016年&输出=主&config=www.conf&framename=index
还是动态请求(也就是还是会比较慢),但是按照我们的设计,每个月应该已经生成了一个静态文件,所以不需要动态生成。如何修改这个功能点也遵循上面静态url的格式?在这里,笔者首先想到了两种方案:
一种是通过js获取年、月的值,然后在表单的动作处拼写出所需的URL
另一种是通过nginx的重写
来实现。经过试比较,第二种方案更适合这里的场景,因为第一种涉及到正确答案。第二种方案只需要在nginx中配置即可(这里,如何从nginx中获取参数值并引用是个小窍门)。
最后,修改后的nginx配置文件如下
server { listen 800; root /usr/local/awstats/wwwroot; access_log /tmp/awstats_access_log access; error_log /tmp/awstats_nginx.error_log notice; location / { index index.html main.html; } # Static awstats files: HTML files stored in DOCUMENT_ROOT/awstats/ location /awstats/classes/ { alias classes/; } location /awstats/css/ { alias css/; } location /awstats/icon/ { alias icon/; } location /awstats-icon/ { alias icon/; } location /awstats/js/ { alias 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_send_timeout 300; #为了让顶部根据时间筛选功能也能用上之前生成的静态页面, 其中%2F部分为url编码后的/,为了取得站点名 if ($query_string ~* "^month=(\d+)&year=(\d+)&output=main&config=.+etc%2F(.+)\.conf&framename=index$") { set $month $1; set $year $2; set $site $3; rewrite ^/cgi-bin/awstats\.pl /$site/$year$month? permanent; } } expires 12h; }
最后,别忘了修改“导入文件”`index.html`哦,js自动生成的超链接要修改,下面的内容要添加修改。
主要修改如下图
好了,整个改进过程到此结束。每个月的统计结果主页面一直是静态的,查看的时候不用等很久!
PS:再好的工具,也不一定完全适合或者满足自己的需求。大多数情况下,作为“软件用户”的运维同胞,应该有这样的意识:不仅会用,必要时还会换。互相鼓励!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)