设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 11617|回复: 9

[日志分析] 使用 awstats 分析 Nginx 的访问日志 [复制链接]

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

签到
68
注册时间
2008-5-19
最后登录
2012-2-3
在线时间
1757 小时
阅读权限
200
积分
12741
帖子
2521
主题
1198
精华
24
UID
1

LT总司令

发表于 2008-11-5 14:10:11 |显示全部楼层
2008 年 11 月 03 日

    本文主要介绍如何通过 awstats 来分析 nginx 的访问日志,并通过 Nginx 输出分析结果到浏览器。

前言

在我的上一篇文章《使用 Nginx 提升网站访问速度》中介绍了 Nginx 这个 HTTP 服务器以及如何通过它来加速网站的访问速度。在实际的网站运营中,我们经常需要了解到网站的访问情况,例如每天有多少 IP 在访问、PV 数是多少、哪个 URL 访问量最大、用户使用最多的浏览器是哪个、都是通过什么方式知道这个网站的以及有多少用户访问出错等等,通过掌握这些信息来提高用户的体验,从而改善网站的质量。一般我们可以通过一些免费的访问统计网站例如 Google Analytics 来或者这些信息。但不足之处是这类网站只能对页面进行分析,不包括静态文件;另外可能有很多的站长不愿意使用这类工具来暴露自己的数据,种种的这些因素使站长希望自己来分析访问日志。而 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.
    * 负载平衡服务器比率集群报告.

Awstats 的运行是需要 PERL 环境的支持,从 awstats 的文档来看,它对 Apache HTTP Server 的支持是非常完美的,而当我们把 Web 服务器换成 Nginx 后,要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl 的支持是比较弱的,甚至官方也不建议使用;另外在日志格式上有需要修改后才能运行。

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

配置 Nginx 自动切割日志

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

# mv  /opt/nginx/logs/access.log /opt/nginx/logs/access_`date +%Y%m%d`.log
# killall ?s USR1 nginx #使用USR1参数通知Nginx进程切换日志文件


将以上脚本内容保存为文件名为 logcron.sh 存到自定的目录中,例如 /opt/nginx/sbin/logcron.sh

使用 Crontab 让该脚本程序在每天晚上 11 点 59 分自动执行,即可做到按天创建日志。

安装和配置 Awstats

安装之前,必须确认你的服务器上 Perl 的环境已经就绪。

查看当前环境 Perl 版本的命令是 perl ?version

我们还需要对 Nginx 的日志格式做个小修改,不然 awstats 将无法进行统计。

例子如下(加粗部分):

# vi /opt/nginx/conf/nginx.conf

server {
listen       80;
server_name  localhost;

location ~ ^/web/ {
root   /data/web;
index  index.html;
error_log off;
charset gb2312;
}

log_format  new_log #格式代称 (注意,如果有多个虚拟主机,代称不能一样)
'$remote_addr - $remote_user [$time_local] $request '
        '"$status" $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log new_log; #日志生成路径

}


下载最新版本的 awstats 包,下载地址请见文章最后的参考资料。把下载后的 tar 包解压到任意目录中,例: /usr/local/awstats 。然后执行 tools 目录中的 awstats_configure.pl 配置向导,创建一个新的统计。

-----> 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 #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:
#> www.moabc.net #统计网站的域名 例:
www.moabc.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):
#>  


使用默认直接回车,接下来便会出现以下的提示

----> Add update process inside a scheduler
Sorry, configure.pl does not support automatic add to cron yet.
You can do it manually by adding the following command to your cron:
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net  
               #回头把该命令填入crontab 按指定时间执行
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.www.moabc.net.conf  
            #新配置文件所在的路径
You should have a look inside to check and change manually main parameters.
You can then manually update your statistics for 'www.moabc.net' with command:
> perl awstats.pl -update -config=www.moabc.net
You can also build static report pages for 'www.moabc.net' with command:
> perl awstats.pl -output=pagetype -config=www.moabc.net

Press ENTER to finish...


回车完成向导,接下来修改 www.moabc.net 的统计配置

#vi /etc/awstats/awstats.www.moabc.net.conf

找到统计的日志文件的路径

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

改为

LogFile="/opt/nginx/logs/access_%YYYY-0%MM-0%DD-0.log

对应上边 Nginx 日志切割程序的所生成的目录存放结构,要注意 Awstats 的年月日格式的跟 Nginx 的写法有所不同。我们现在执行统计的顺序是:

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

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

   1. 先执行日志切割脚本 logcron.sh 把 Nginx 的日志切下来。
   2. 然后执行 Awstats 日志更新程序开始统计分析。

# /opt/nginx/sbin/logcron.sh
# /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net

Create/Update database for config "/etc/awstats/awstats.www.moabc.net.conf"
        by AWStats version 6.7 (build 1.892)
From data in log file "/opt/nginx/logs/access_20080804.log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 450421)
Jumped lines in file: 450421
Found 450421 already parsed records.
Parsed lines in file: 120
Found 0 dropped records,
Found 0 corrupted records,
Found 0 old records,
Found 120 new qualified records.


看到以上显示,证明日志切割和 Awstats 都已经运行无误了。统计分析完成后,结果还在 Awstats 的数据库中。在 Apache 上,可以直接打开 Perl 程序的网页查看统计。但本文开始时已经提到,Nginx 对 Perl 支持并不好,所以我们要换个方法,利用 awstats 的工具将统计的结果生成静态文件,具体的步骤如下:

    * 首先在 webroot 目录下创建一个文件夹。例:/data/webroot/awstats
    * 然后让 Awstats 把静态页面生成到该目录中

# mkdir  /data/webroot/awstats

# /usr/local/awstats/tools/awstats_buildstaticpages.pl -update  \
-config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats  \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl


上述命令的具体意思如下:

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

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

server {
listen       80;
server_name  localhost;

location ~ ^/web/ {
root   /data/web;
index  index.html;
error_log off;
charset gb2312;
}

location ~ ^/awstats/ {     # html 静态页面目录
        root   /data/webroot/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://youhostname/awstats/awstats.www.moabc.net.html

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

配置 Awstats 自动运行

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

#vi /etc/crontab

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

00 1 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl  \
-update -config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl  

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

:wq保存退出
#crontab /etc/crontab 指定cron所执行的配置档路径

保护日志统计结果页面

一般站长都不愿随便让人知道自己站的真实流量,所以要把 Awstats 统计结果页面进行密码保护。Nginx 使用的是跟 Apache 一样的密码加密格式,这里需要用到 apache 自带的工具 htpasswd。

如果你在本机上默认装有 Apache,这你就只需在它的程序目录下运行

例:

#/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 中加入(加粗部分):

server {
  listen       80;
  server_name  localhost;
  location ~ ^/web/ {
  root   /data/web;
  index  index.html;
  error_log off;
  charset gb2312;
  }

  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; #密码包路径
        }

        location ~ ^/icon/ {             # 图标目录
        root   /usr/local/awstats/wwwroot;
        index  index.html;
        access_log off;
        error_log off;
        charset gb2312;
        }
}

修改 Nginx 配置完毕后,执行命令 killall ?s HUP nginx 让 Nginx 重新加载配置即可。
总结

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

    * 开源中国社区:http://www.oschina.net
    * Nginx 中文网站:http://www.nginx.cn
    * Nginx 英文站点:http://www.nginx.net
    * Awstats 网址:http://awstats.sourceforge.net



作者简介



刘柄成一直使用 J2EE/J2ME 从事移动互联网方面的开发。DLOG4J 的作者,您可以通过 Java 自由人网站来跟他联系,网址是:http://www.javayou.com ,另外他的邮件地址是 javayou@gmail.com



范绰耘,服务器软硬件技术架构、开源软件的热衷者,现任职广州市摩网信息技术有限公司系统管理员,您可以通过开源中国社区网站 http://www.oschina.net 来联系我。

来源: http://www.ibm.com/developerwork ... html?ca=drs-cn-1103
感谢大家对linuxtone的支持!

Rank: 3Rank: 3

注册时间
2009-4-30
最后登录
2012-1-16
在线时间
17 小时
阅读权限
30
积分
420
帖子
17
主题
0
精华
0
UID
2786
发表于 2009-4-30 11:16:29 |显示全部楼层
请教下,我按这个方法去生成,但是用awstats去分析时提示:
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
AWStats did not find any valid log lines that match your LogFormat parameter, in the 50th first non commented lines read of your log.
Your log file /data1/logs/2009/04/access_20090425.log must have a bad format or LogFormat parameter setup does not match this format.
Your AWStats LogFormat parameter is:
1
This means each line in your web server log file need to have "combined log format" like this:
111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] "GET / HTTP/1.1" 200 1234 "http://www.fromserver.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
And this is an example of records AWStats found in your log file (the record number 50 in your log):
124.156.154.250 - - [25/Apr/2009:03:25:59 +0800] POST /classes/t_ad_general.php HTTP/1.1 "200" 3107 "http://xxx.com/classes/t_ad_general.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; MAXTHON 2.0)" "-"
Setup ('/etc/awstats/awstats.passport.conf' file, web server or permissions) may be wrong.
Check config file, permissions and AWStats documentation (in 'docs' directory).

使用道具 举报

Rank: 3Rank: 3

注册时间
2009-4-30
最后登录
2012-1-16
在线时间
17 小时
阅读权限
30
积分
420
帖子
17
主题
0
精华
0
UID
2786
发表于 2009-4-30 11:25:35 |显示全部楼层
有大侠知道怎么解决的麻烦告诉我。shinewinds@gmail.com

使用道具 举报

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

注册时间
2008-5-19
最后登录
2012-2-3
在线时间
1757 小时
阅读权限
200
积分
12741
帖子
2521
主题
1198
精华
24
UID
1

LT总司令

发表于 2009-4-30 14:14:57 |显示全部楼层
This means each line in your web server log file need to have "combined log format"
请查看你的日志格式:

在http{}内定义log格式:
log_format  combined  '$remote_addr - $remote_user [$time_local] '                     
'"$request" $status $apache_bytes_sent '
'"$http_referer" "$http_user_agent"';
log_format表示log格式,combined表示定义的格式名称,后面表示格式样式。

在server{}内定义日志文件的位置和相应的格式:
access_log  /data/weblogs/www1_access.log  combined;


注:如果你是经较新版本这个combined模式已经是默认的了,无须再要像上面一样声明了,详细可以看官方WIKI,仍后尝试一下。
其它发现问题请GOOGLE,相关安装可参考:
http://bbs.linuxtone.org/thread-56-1-1.html
感谢大家对linuxtone的支持!

使用道具 举报

Rank: 3Rank: 3

注册时间
2009-4-30
最后登录
2012-1-16
在线时间
17 小时
阅读权限
30
积分
420
帖子
17
主题
0
精华
0
UID
2786
发表于 2009-5-1 23:15:14 |显示全部楼层
我在nginx里的设置参考了别人是这样的:
    log_format  main  '$remote_addr - $remote_user [$time_local] $request '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /data1/logs/nginx_access.log  main;
我先试下你的,可能网上的这种日志格式不对。

使用道具 举报

Rank: 3Rank: 3

注册时间
2009-4-30
最后登录
2012-1-16
在线时间
17 小时
阅读权限
30
积分
420
帖子
17
主题
0
精华
0
UID
2786
发表于 2009-5-1 23:16:26 |显示全部楼层
或者是否可以调整awstat的config格式?怎么调整awstat的日志格式?麻烦给个样例。

使用道具 举报

Rank: 3Rank: 3

注册时间
2009-4-30
最后登录
2012-1-16
在线时间
17 小时
阅读权限
30
积分
420
帖子
17
主题
0
精华
0
UID
2786
发表于 2009-5-1 23:46:27 |显示全部楼层
谢谢楼上的提高思路,我按照你的方法,重新写了下nginx的配置文件,若要用apache的规则需要这样写。导入成功。可能版本不同,所以用网上的日志格式是不行的,分享下我的配置:


log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent"';

使用道具 举报

金牌会员

Selboo

Rank: 6Rank: 6

注册时间
2009-3-29
最后登录
2012-2-3
在线时间
212 小时
阅读权限
70
积分
2290
帖子
91
主题
0
精华
0
UID
2190
发表于 2009-5-9 11:47:10 |显示全部楼层
老大

11 59 * * * /opt/nginx/sbin/logcron.sh #半夜11:59  进行日志切割
上面的写错了

应该是
59 23 * * * /opt/nginx/sbin/logcron.sh
分钟在前面,使用24小时制
色萝卜
天很白,云很蓝...
http://selboo.com.cn

使用道具 举报

Rank: 3Rank: 3

注册时间
2010-2-3
最后登录
2011-11-30
在线时间
26 小时
阅读权限
30
积分
264
帖子
56
主题
24
精华
0
UID
7838
发表于 2010-8-4 10:16:03 |显示全部楼层
各位也没有发现,awstats会自动舍弃一些有用数据呢?

例如

Jumped lines in file: 0
Parsed lines in file: 7844994
Found 7821335 dropped records,
Found 23659 corrupted records,
Found 0 old records,
Found 0 new qualified records.

大家看看第二行,为何有那么多的日志被dropped呢??

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢红之盟网络提供带宽支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2012-2-4 18:00 , Processed in 0.079911 second(s), 12 queries , Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部