在debian上启用AWstats对Nginx作静态访问统计

发表于2012 年 05 月 23 日 | 标签: , ,

本文目标: 在debian上为nginx部署awstats进行web的静态访问统计,一天生成一次报告。

软件环境: Debian 6.0(Squeeze), Ngnix 0.7.67, awstats 6.95, perl v5.10.1

 

AWstats 是一个老牌的开源访问统计软件,它的统计原理是以服务器的log记录为分析基础,在分析服务器的日志文件后,输出并保存到每日递增的数据文件,这样,在前台访问时,就可以动态的以网页视图的画面方式来展现这些访问记录。原则上,只要是有log文件输出的服务器,AWstats就能开展分析工作,当然它默认已经包含了很多典型的服务器处理方式,包括Web服务器(IIS, apache等), FTP服务器, eMail服务器等等。另外,那些默认没有对应log范式的服务器,你也可以通过配置让它工作。

 

运行awstats进行访问统计,要通过perl的支持。而awstats有两种工作模式:

  1. 进行实时访问统计

    如果你要查看实时的访问统计报告,除了安装基本的perl语言包外,还需要安装perl的FCGI.pm模块和ProcManager.pm模块来支持CGI动态交互。那么你便可以在网站上架起一个/cgi-bin目录存放awstats的代码,通过网址调用这些perl脚本从而触发计算,然后获取实时结果。这种模式的好处是可以查看每个时刻的访问统计,不好的是降低了安全性,并增加了服务器压力,响应速度也慢了。
     

  2. 手动输出访问统计

    如果你不太关心实时访问统计,那么你可以在需要的时候登录服务器,手动执行awstats工具软件中的命令,手动生成统计结果,输出为html格式的静态网页后,再通过网址查看。配合cron,还可以定时生成报告,非常方便。这种模式可以减轻服务器的压力,而且不需要安装这么多额外的perl组件。

 

本文这里只关心如何通过awstats为ngnix作静态的访问统计。

假定你已经安装好nginx和perl了,否则请先安装它们

apt-get install nginx perl

安装awstats

apt-get install awstats

假设我们要为网址sunny-play.com进行访问统计,请在awstats的配置目录下新建该域名的专属配置文件,并写上如下配置

$ vi /etc/awstats/awstats.sunny-play.com.conf  

#文件内容
Include "/etc/awstats/awstats.conf"
LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
LogFile="/var/log/nginx/sunny-play.com/access.log"
SiteDomain="sunny-play.com"
HostAliases="www.sunny-play.com"
DirData="/var/lib/awstats/sunny-play.com/"
DirIcons="/awstats-icon"

其中

  • LogFormat变量表示的是,access.log文件中每行的log输出,都以此格式进行变量获取到awstats程序中。这里所写的格式是ngnix的默认log输出,如果你nginx中的log输出格式有自定义的格式,记得修改这里。
  • DirData表示awstats每次分析后,数据文件(文本数据库,非最终报告页面)保存到哪里,默认是/var/lib/awstats,当然你配置到任意想放的地方。

上面我们指定的数据目录是不存在的,我们来创建

mkdir /var/lib/awstats/sunny-play.com

因为待会那些awstats的命令是使用用户www-data来执行的,所以这个目录至少要对www-data开放读写权限,或直接修改所属人。

chown www-data:www-data /var/lib/awstats/sunny-play.com

配置好后,可以简单测试一下awstats能开始工作了没有

sudo -u www-data /usr/share/awstats/tools/update.sh   #使用www-data用户来执行是一个好的实践

此时,若能看到/var/lib/awstats/sunny-play.com/下有两份txt文件输出了,便表示awstats能正确找到你的配置并开始工作了,那请执行下一步。如果没有,请检查你刚才在/etc/awstats下的配置有没有错,例如,awstats.sunny-play.com.conf名字有没有写错?access.log的路径有没错?里面有没有可用的访问记录?DirData目录是否存在等。

sudo -u www-data /usr/share/awstats/tools/buildstatic.sh   #使用www-data用户来执行是一个好的实践

上面的命令执行完,你会在/var/cache/awstats/sunny-play.com/下找到一个年和月的目录,例如/var/cache/awstats/sunny-play.com/2012/05/,里面是一堆生成的具体报告,大致如下:

awstats.sunny-play.com.alldomains.en.html
awstats.sunny-play.com.allhosts.en.html
awstats.sunny-play.com.allrobots.en.html
awstats.sunny-play.com.browserdetail.en.html
awstats.sunny-play.com.en.html
awstats.sunny-play.com.errors404.en.html
awstats.sunny-play.com.keyphrases.en.html
awstats.sunny-play.com.keywords.en.html
.....
...

其中,awstats.sunny-play.com.en.html便是那份主报告。如果希望生成的报告是中文的,可以在/etc/default/awstats中进行调整。

现在报告是生成了,我们如何查看呢?把这个目录暴露到nginx吧!当然,我们不想任何人都能看到我们的访问统计,所以加个查看密码吧。首先,执行下面命令生成一个访问用户和密码

mkdir /etc/awstats/passwd

# 生成用户名admin, 密码是123的密码文件sunny-play.com.htpasswd
printf "admin:$(openssl passwd -crypt 123)\n" >> /etc/awstats/passwd/sunny-play.com.htpasswd

chown www-data:www-data -R /etc/awstats/passwd

然后在对应网站的nginx配置文件中,配置一个目录来作为查看访问报告的入口,我下面是设置了/awstats目录作为入口

# vi /etc/nginx/sites-enabled/sunny-play.com

server {
    listen 80;
    server_name  sunny-play.com;

    access_log  /var/log/nginx/sunny-play.com/access.log;
    error_log  /var/log/nginx/sunny-play.com/error.log;

    location / {
        ...
        ...
    }    

    location  /awstats/ {
        alias  /var/cache/awstats/sunny-play.com/;
        access_log off;
        error_log /dev/null crit;
        autoindex on;                                 #打开目录访问
        auth_basic "Restricted";                      #配置访问限制和密码文件
        auth_basic_user_file /etc/awstats/passwd/sunny-play.com.htpasswd;
    }

    location  /awstats-icon/ {
        alias  /usr/share/awstats/icon/;
    }    

}

让ngnix重新加载该配置

/etc/init.d/nginx reload

此时,你访问网址http://sunny-play.com/awstats/,输入上面配置的帐号和密码,就可以看到当日的访问统计。

另外,因为nginx每天的log文件都会被logrotate轮转重新生成,虽然debian中的cron已经把awstats的update收录(默认每10分钟增量update一次库),但是,每天在被替换前,最好还是要先把当天的那些剩下未处理的log内容也加入到awstats的数据文件才对。因此我们需要修改/etc/logrotate.d/nginx,为其加上强行update的处理

/var/log/nginx/*.log
/var/log/nginx/*/*.log {
    daily
    ...
    sharedscripts
    prerotate
        [ -x /usr/share/awstats/tools/update.sh ] && sudo -u www-data /usr/share/awstats/tools/update.sh
    endscript
    ...
}

改好后执行logrotate命令让其生效

logrotate -f /etc/logrotate.conf

 

最后,提三个事情,

1. 以上一些命令以及路径,只是debian版本下的awstats才特有。RH linux系下的awstats,命令名以及参数会有所不同。

2. 安装好debian中的awstats后,cron中会新建了两个定时任务,分别是每10分钟update一次awstats的库文件,和每晚会根据最新的库文件生成一次静态html报告。

3. 这种方法配置的awstats,支持多域名的统计很容易。大概就是在/etc/awstats中创建一个新的conf文件对应要统计的域名,然后再在该域名的nginx配置文件中如上炮制,就基本上可以了。剩下的,awstats会为你自动update和build static page.

 

 

在debian上启用AWstats对Nginx作静态访问统计』有 3 条评论

  1. hkdzy

    我想在CentOS上用,,, 步骤也一样吗 :twisted:

    • admin

      嗯,在CentOS上,过程基本是一样的。不同的主要是文件路径。

      /usr/share/awstats/tools/update.sh 和 /usr/share/awstats/tools/buildstatic.sh 也许不是这个路径。默认的产生的文件也可能不在cache目录,在/var/www/awstats/目录。仔细看看awstats的conf文件即可

  2. Pingback 引用通告: 官方推荐的 Nginx 学习资源 | 大秦.IT

发表评论

*

  

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif