日志分析工具Awstats实战之Nginx篇-分析结果动态化

上一篇博文“分析工具Awstats实战之Nginx篇-分析结果静态化”介绍了如何将awstats的日志分析信息用静态页面来进行显示,不过显示效果肯定没有动态的好啦。本篇博文将带大家一起来部署动态的分析结果查阅。

环境:

CentOS 6.4ip:192.168.1.113域名:(server和client都通过hosts文件解析)nginx-1.2.9 编译安装,路径/usr/local/nginx,服务开启状态日志记录格式为nginx默认的,切勿更改,否则会造成awstats无法分析日志。log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ”$status $body_bytes_sent “$http_referer” ””$http_user_agent” “$http_x_forwarded_for”‘;awstats-7.2.tar.gz CPAN-2.00.tar.gz FCGI-0.74.tar.gz FCGI-ProcManager-0.24.tar.gz必须有perl-devel,不然无法编译FCGI。

一、日志自动切割

对于nginx的日志切割,由于没有像apache一样去用cronolog工具,这里我们就写一个脚本,让它可以在每天00:01自动执行,切割昨天的日志(交由awstats分析),压缩前天的日志(压缩日志可减小存储空间,为防止awstats没有分析完就被压缩,所以只压缩前天的日志)。

vim /server/scripts/cut_nginx_log.sh

输入以下内容:

#!/bin/shyesterday=`date -d “yesterday” +”%Y%m%d”`before_yesterday=`date -d “-2 day” +”%Y%m%d”`Nginx_Dir=”/usr/local/nginx”Nginx_logs=”/app/logs”Log_Name=”www_access”cd /tmp[ -d $Nginx_Logs ] && cd $Nginx_logs || exit 1[ -f $Log_Name.log ] && /bin/mv $Log_Name.log ${Log_Name}_${yesterday}.log || exit 1if [ $? -eq 0 -a -f $Nginx_Dir/logs/nginx.pid ]thenkill -USR1 `cat $Nginx_Dir/logs/nginx.pid`fi[ -f ${Log_Name}_${before_yesterday}.log ] && /usr/bin/gzip ${Log_Name}_${before_yesterday}.log|| exit 1

执行crontab -e将该脚本加入定时任务中

1 0 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

这样每天凌晨00:01就能自动实现日志的切割,压缩等功能了。

因为本次实验下的nginx此时已经有日志了,另外为了后文awstats能对切割过的日志进行分析,所以这里我们要运行一下此脚本,来将现有日志进行切割生成昨天的日志方便后文操作。

/bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

二、配置FCGI

1、安装CPAN

wget tar zxf CPAN-2.00.tar.gzcd CPAN-2.00perl Makefile.PLmake && make install

2、安装FCGI和FCGI::ProcManager

wget tar zxf FCGI-0.74.tar.gzcd FCGI-0.74第一种安装方法:perl -MCPAN -e ‘install FCGI’第二种安装方法:perl Makefile.PLmake&&make installwget tar zxf FCGI-ProcManager-0.24.tar.gzcd FCGI-ProcManager-0.24第一种安装方法:perl -MCPAN -e ‘install FCGI::ProcManager’第二种安装方法:perl Makefile.PLmake&&make install

在执行第一种安装方法的时候,一定是全程自动滚动下来提示OK的。如果出现提示你输入yes之类的,你需要按提示操作完之后,再运行第二次直到全程自动滚动下来提示OK才为完成安装。或者你就用第二种方法来执行安装。

3、创建FCGI启动文件

vi /usr/local/nginx/sbin/fcgi#此处按个人习惯命名#!/usr/bin/perluse FCGI;#perl -MCPAN -e ‘install FCGI’use Socket;use POSIX qw(setsid);#use Fcntl;require ‘syscall.ph’;&daemonize;#this keeps the program alive or something after exec’ing perl scriptsEND() { } BEGIN() { }*CORE::GLOBAL::exit = sub { die “fakeexit\nrc=”.shift().”\n”; };eval q{exit};if ($@) {exit unless $@ =~ /^fakeexit/;};&main;sub daemonize() {chdir ‘/’or die “Can’t chdir to /: $!”;defined(my $pid = fork) or die “Can’t fork: $!”;exit if $pid;setsidor die “Can’t start a new session: $!”;umask 0;}sub main {#$socket = FCGI::OpenSocket( “127.0.0.1:8999”, 10 );$socket = FCGI::OpenSocket( “/usr/local/nginx/fastcgi_temp/perl_cgi-dispatch.sock”, 10 );#use UNIX sockets – user running this script must have w access to the ‘nginx’ folder!!$request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );if ($request) { request_loop()};FCGI::CloseSocket( $socket );}sub request_loop {while( $request->Accept() >= 0 ) {#processing any STDIN input from WebServer (for CGI-POST actions)$stdin_passthrough =”;$req_len = 0 + $req_params{‘CONTENT_LENGTH’};if (($req_params{‘REQUEST_METHOD’} eq ‘POST’) && ($req_len != 0) ){my $bytes_read = 0;while ($bytes_read < $req_len) {my $data = ”;my $bytes = read(STDIN, $data, ($req_len – $bytes_read));last if ($bytes == 0 || !defined($bytes));$stdin_passthrough .= $data;$bytes_read += $bytes;}}#running the cgi appif ( (-x $req_params{SCRIPT_FILENAME}) && #can I execute this?(-s $req_params{SCRIPT_FILENAME}) && #Is this file empty?(-r $req_params{SCRIPT_FILENAME})#can I read this file?){pipe(CHILD_RD, PARENT_WR);my $pid = open(KID_TO_READ, “-|”);unless(defined($pid)) {print(“Content-type: text/plain\r\n\r\n”);print “Error: CGI app returned no output – Executing $req_params{SCRIPT_FILENAME} failed !\n”;next;}if ($pid > 0) {close(CHILD_RD);print PARENT_WR $stdin_passthrough;close(PARENT_WR);while(my $s = <KID_TO_READ>) { print $s; }close KID_TO_READ;waitpid($pid, 0);} else {foreach $key ( keys %req_params){$ENV{$key} = $req_params{$key};}# cd to the script’s local directoryif ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {chdir $1;}close(PARENT_WR);close(STDIN);#fcntl(CHILD_RD, F_DUPFD, 0);syscall(&SYS_dup2, fileno(CHILD_RD), 0);#open(STDIN, “<&CHILD_RD”);exec($req_params{SCRIPT_FILENAME});die(“exec failed”);}}else {print(“Content-type: text/plain\r\n\r\n”);print “Error: No such CGI app – $req_params{SCRIPT_FILENAME} may not exist or isnot executable by this process.\n”;}}}wget tar zxf awstats-7.2.tar.gzmv awstats-7.2 /usr/local/awstats是我一生的快乐;失去你,是我一生的遗憾;没有你,无法感受心灵的震撼。

日志分析工具Awstats实战之Nginx篇-分析结果动态化

相关文章:

你感兴趣的文章:

标签云: