日誌分析工具Awstats的分析結果動態化

來源:互聯網
上載者:User

上一篇博文“分析工具Awstats實戰之Nginx篇-分析結果靜態化”介紹了如何將awstats的日誌分析資訊用靜態頁面來進行顯示,不過顯示效果肯定沒有動態好啦。本篇博文將帶大家一起來部署動態分析結果查閱。

環境:

CentOS 6.4
ip:192.168.1.113
網域名稱:www.sunsky.com(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/sh
yesterday=`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 1
if [ $? -eq 0 -a -f $Nginx_Dir/logs/nginx.pid ]
   then
      kill -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 http://search.cpan.org/CPAN/authors/id/A/AN/ANDK/CPAN-2.00.tar.gz
tar zxf CPAN-2.00.tar.gz
cd CPAN-2.00
perl Makefile.PL
make && make install

2、安裝FCGI和FCGI::ProcManager

wget http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/FCGI-0.74.tar.gz
tar zxf FCGI-0.74.tar.gz
cd FCGI-0.74
第一種安裝方法:perl -MCPAN -e 'install FCGI'
第二種安裝方法:perl Makefile.PL
               make&&make install
wget http://search.cpan.org/CPAN/authors/id/B/BO/BOBTFISH/FCGI-ProcManager-0.24.tar.gz
tar zxf FCGI-ProcManager-0.24.tar.gz
cd FCGI-ProcManager-0.24
第一種安裝方法:perl -MCPAN -e 'install FCGI::ProcManager'
第二種安裝方法:perl Makefile.PL
               make&&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;    setsid                    or 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 app            if ( (-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 directory                        if ($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";            }        }}

建立完成後,需要賦予fcgi執行許可權:

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。