2009年4月11日星期六

使用 awstats 分析 Nginx 的访问日志

概述:众所周知,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.
负载平衡服务器比率集群报告.
Awstats 的运行是需要 PERL 环境的支持,从 awstats 的文档来看,它对 Apache HTTP Server 的支持是非常完美的,而当我们把 Web 服务器换成 Nginx 后,要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl 的支持是比较弱的,甚至官方也不建议使用;另外在日志格式上有需要修改后才能运行。

本文主要介绍通过让 awstats 对日志统计的结果生成静态页面,然后通过 Nginx 输出以达到统计 Nginx 访问日志的效果,其中还包括如何让 Nginx 自动切割日志文件。

在上一篇文章:《在vps主机配置nginx+php(fastcgi)+mysql环境》介绍了 Nginx 这个 HTTP 服务器以及如何通过它来加速网站的访问速度。在实际的网站运营中,我们经常需要了解到网站的访问情况,例如每天有多少 IP 在访问、PV 数是多少、哪个 URL 访问量最大、用户使用最多的浏览器是哪个、都是通过什么方式知道这个网站的以及有多少用户访问出错等等,通过掌握这些信息来提高用户的体验,从而改善网站 的质量。一般我们可以通过一些免费的访问统计网站例如 Google Analytics 来或者这些信息。但不足之处是这类网站只能对页面进行分析,不包括静态文件;另外可能有很多的站长不愿意使用这类工具来暴露自己的数据,种种的这些因素使 站长希望自己来分析访问日志。而 awstats 就可以满足所有的这些需求。

目的:本文就来详细讲一下如何在vps主机已经配合nginx的环境下,使用awstats来统计我们的访问日志

环境:vps主机特惠型 centos操作系统

nginx安装目录:/usr/local/webserver/nginx

网页存放目录:/data0/htdocs/vps

日志存放路径:/data1/logs

perl版本:5.8

统计网站名称:vps.15099.net

awstats版本:6.8 官方地址:http://awstats.sourceforge.net/ tar.gz压缩包下载地址

步骤:

1、配置nginx自动分割日志


跟 Apache HTTP Server(以下称 Apache)不同的是,Apache 可以将日志输出通过管道的方式进行重新定向,依此来进行自动的日志切割。Nginx 在现今版本上还没能跟 Apache 一样,通过%YY等参数按日期分批创建日志,但是通过给 nginx 进程发送一个特定的信号,可以使 nginx 重新生成日志文件。我们可以定期执行一个 Shell 脚本来切换日志,重新命名或转移,具体的脚本如下:

[root@basic ~]#vi /usr/local/webserver/nginx/sbin/logcron.sh
mv /data1/logs/access.log /data1/logs/access_`date +%Y%m%d`.log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
#使用USR1参数通知Nginx进程切换日志文件
修改logron.sh执行权限

#chmod +x /usr/local/webserver/nginx/sbin/logcron.sh
2、安装和配置awstats

[root@basic conf]# cd /usr/local/

[root@basic local]# mkdir awstats

[root@basic awstats]# wget http://prdownloads.sourceforge.net/awstats/awstats-6.8.tar.gz

[root@basic awstats]# tar zxvf awstats-6.8.tar.gz

[root@basic awstats]# mv awstats-6.8/* ./

[root@basic awstats]# rm -rf awstats-6.8.tar.gz

[root@basic awstats]# cd tools/[root@basic tools]# ./awstats_configure.pl

----- AWStats awstats_configure 1.0 (build 1.8) (c) Laurent Destailleur -----
This tool will help you to configure AWStats to analyze statistics for
one web server. You can try to use it to let it do all that is possible
in AWStats setup, however following the step by step manual setup
documentation (docs/index.html) is often a better idea. Above all if:
- You are not an administrator user,
- You want to analyze downloaded log files without web server,
- You want to analyze mail or ftp log files instead of web log files,
- You need to analyze load balanced servers log files,
- You want to 'understand' all possible ways to use AWStats...
Read the AWStats documentation (docs/index.html).

-----> Running OS detected: Linux, BSD or Unix

-----> Check for web server install

Enter full config file path of your Web server.
Example: /etc/httpd/httpd.conf
Example: /usr/local/apache2/conf/httpd.conf
Example: c:\Program files\apache group\apache\conf\httpd.conf
Config file path ('none' to skip web server setup):
> none #因为我们这里使用nginx,所以输入none,跳过此步
按回车

Your web server config file(s) could not be found.
You will need to setup your web server manually to declare AWStats
script as a CGI, if you want to build reports dynamically.
See AWStats setup documentation (file docs/index.html)

-----> Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
File awstats.model.conf updated.

-----> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ? y #创建一个新的统计配置
按回车

----->; Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
>vps.15099.net #统计网站域名,这里填写vps.15099.net为例
按回车

-----> Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
> #这里提示配置文件存放在那里,我们这里按默认值,存放到/etc/awstats
按回车,接下来便会出现以下的提示

-----> Create config file '/etc/awstats/awstats.vip.15099.net.conf'
Config file /etc/awstats/awstats.vip.15099.net.conf created. #提示配置文件已经创建

-----> Add update process inside a scheduler
Sorry, configure.pl does not support automatic add to cron yet. #提示未成功自动运行脚本到cron
You can do it manually by adding the following command to your cron: #你可以手动把下列脚本添加到cron
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=vip.15099.net
Or if you have several config files and prefer having only one command: #提示如果有其他的配置文件,
/usr/local/awstats/tools/awstats_updateall.pl now #只需要运行下面命令
Press ENTER to continue...
按回车

A SIMPLE config file has been created: /etc/awstats/awstats.vip.15099.net.conf #新配置文件所在的路径
You should have a look inside to check and change manually main parameters.
You can then manually update your statistics for 'vip.15099.net' with command:
> perl awstats.pl -update -config=vip.15099.net
You can also build static report pages for 'vip.15099.net' with command:
>perl awstats.pl -output=pagetype -config=vip.15099.net

Press ENTER to finish...
按回车,完成向导,接下来修改 vps.15099.net 的统计配置
[root@basic tools]#vi /etc/awstats/awstats.vip.15099.net.conf
找到统计的日志文件的路径

LogFile=”/var/log/httpd/mylog.log”

改为
LogFile=”/data1/logs/access_%YYYY-0%MM-0%DD-0.log”
对应上边 Nginx 日志切割程序的所生成的目录存放结构,要注意 Awstats 的年月日格式的跟 Nginx 的写法有所不同。我们现在执行统计的顺序是:

Nginx 产生日志 –> 日志切割 –> Nginx 继续产生日志 –> 另存切割日志 –> 交由Awstats统计 –> 生成结果

在本文中 Awstats 所统计的日志,是已切下来的那部分。也能调转顺序,先统计完了再切。不过这比较容易造成统计的遗漏。配置修改完成后,保存退出。然后我们可以开始试一下手动执行。

先执行日志切割脚本 logcron.sh 把 Nginx 的日志切下来。
然后执行 Awstats 日志更新程序开始统计分析。
/usr/local/webserver/nginx/sbin/logcron.sh
mkdir /var/lib/awstats/
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=vps.15099.net
[root@basic awstats]# /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=vps.15099.net
Create/Update database for config "/etc/awstats/awstats.conf" by AWStats version 6.8 (build 1.910)
From data in log file "/data1/logs/access_20081218.log"...
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
Jumped lines in file: 0
Parsed lines in file: 0
Found 0 dropped records,
Found 0 corrupted records,
Found 0 old records,
Found 0 new qualified records.
看到以上显示,证明日志切割和 Awstats 都已经运行无误了。统计分析完成后,结果还在 Awstats 的数据库中。在 Apache 上,可以直接打开 Perl 程序的网页查看统计。但本文开始时已经提到,Nginx 对 Perl 支持并不好,所以我们要换个方法,利用 awstats 的工具将统计的结果生成静态文件,具体的步骤如下:
* 首先在 webroot 目录下创建一个文件夹。例:/data0/vps/awstats
* 然后让 Awstats 把静态页面生成到该目录中

# mkdir /data0/htdocs/vps/awstats
# perl /usr/local/awstats/tools/awstats_buildstaticpages.pl -update \
-config=vps.15099.net -lang=cn -dir=/data0/htdocs/vps/awstats \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
上述命令的具体意思如下:

* /usr/local/awstats/tools/awstats_buildstaticpages.pl Awstats 静态页面生成工具
* -update -config=vps.15099.net 更新配置项
* -lang=cn 语言为中文
* -dir=/data0/vps/awstats 统计结果输出目录
* -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl Awstats 日志更新程序路径。

接下来,只需在nginx.conf 中,把该目录配置上去即可。例子如下:(加粗部分):

location ~ ^/awstats/ { # html 静态页面目录
root /data0/htdocs/vps/awstats;
index index.html;
access_log off;
error_log off;
charset gb2312; #最好把默认编码改成 gb2312避免浏览器因自动编码出现乱码的情况
}

location ~ ^/icon/ { # 图标目录
root /usr/local/awstats/wwwroot;
index index.html;
access_log off;
error_log off;
charset gb2312;
}
用浏览器查看到统计的详细结果 http://vps.15099.net/awstats/awstats.vps.15099.net.html

至此,使用 awstats 已能完全支持 Nginx 的日志统计。

3、配置 Awstats 自动运行
为了让整个日志的统计过程自动完成,我们需要设置 crontab 计划任务,让 Nginx 日志切割以及 Awstats 自动运行,定时生成结果页面。

#crontab -e

11 59 * * * /usr/local/webserver/nginx/sbin/logcron.sh #半夜11:59 进行日志切割

00 1 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl \
-update -config=vps.15099.net -lang=cn -dir=/data0/htdocs/vps/awstats \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

#凌晨00:01 Awstats进行日志分析

:wq保存退出
#crontab /etc/crontab 指定cron所执行的配置档路径
4、保护日志统计结果页面
一般站长都不愿随便让人知道自己站的真实流量,所以要把 Awstats 统计结果页面进行密码保护。Nginx 使用的是跟 Apache 一样的密码加密格式,这里需要用到 apache 自带的工具 htpasswd。

#/usr/local/apache2/bin/htpasswd -c admin.pass admin #用户名为admin

New password: 输入密码
Re-type new password: 重复输入
Adding password for user admin 创建成功

然后把 admin.pass 这个密码包找个的地方藏起来.
修改 nginx.conf 在 location 中加入(加粗部分):

location ~ ^/awstats/ { # html 静态页面目录
root /data/admin_web;
index index.html;
access_log off;
error_log off;
charset gb2312;
auth_basic "admin"; #用户名
/opt/ngx/conf/admin.pass; #密码包路径


修改 Nginx 配置完毕后,执行命令kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`
5、总结

尽管跟 Apache HTTP Server 相比较而言,Nginx 的功能是比较弱的,但是我们依然可以利用一些技巧来规避这些弱点,Nginx 的设计者肯定也是充分考虑到这个问题。现在也越来越多的第三方开发的模块在逐渐的扩展 Nginx 的功能。但是从应用本身的角度而言,Nginx 更倾向于卓越的性能,而非大而全的功能,因而在一些附加方面的功能,我们也不能对之要求过高。

没有评论:

发表评论