Home > Database > Mysql Tutorial > Awstats 配置详解

Awstats 配置详解

WBOY
Release: 2016-06-07 15:03:36
Original
13622 people have browsed it

[root@test src]# wget http://prdownloads.sourceforge.net/awstats/awstats-6.95.tar.gz [root@test src]# tar zxvf awstats-6.95.tar.gz [root@test src]# mv awstats-6.95 /usr/local/awstats [root@test src]# mkdir /var/lib/awstats [root@test awsta

[root@test src]# wget http://prdownloads.sourceforge.net/awstats/awstats-6.95.tar.gz

[root@test src]# tar zxvf awstats-6.95.tar.gz

[root@test src]# mv awstats-6.95 /usr/local/awstats

[root@test src]# mkdir /var/lib/awstats

[root@test awstats]# mkdir -m 755 /usr/local/awstats/data/

[root@test src]# cd /usr/local/awstats/

[root@test awstat]# perl /usr/local/awstats/tools/awstats_configure.pl

只填写域名,其它选项全部y或默认

[root@test awstats]# vi /etc/awstats/awstats.www.123.com.conf

修改日志文件路径:

LogFile="/usr/local/awstats/tools/logresolvemerge.pl /home/tool/access.20100817.11*.log |"

此为用awstats脚本自动合并分析所有/home/tool/access.20100817.11*.log日志

如果日志使用tar -zcvf 压缩,logresolvemerge.pl会自动调用zcat

也可以同时列出多个日志文件,如以下格式:

LogFile="/usr/local/awstats/tools/logresolvemerge.pl 1.log 2.log |"

合并日志也可用以下方式:

cat a.log b.log c.log | sort -m -t " " –k 4 > log

       将三个日志以空格为分隔符,对第四列进行排序,结果保存在log

 

添加GeoIP插件使awstats可以显示用户地理位置

cpan install Geo::IP

[root@test awstats]# cd /usr/local/src/

[root@test src]# wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz

[root@test src]# tar zxvf GeoIP.tar.gz

[root@test src]# cd GeoIP-1.4.6/

[root@test GeoIP-1.4.6]# ./configure && make && make install

[root@test src]# wget http://geolite.maxmind.com/download/geoip/api/perl/Geo-IP-1.38.tar.gz

[root@test src]# tar zxvf Geo-IP-1.38.tar.gz

[root@test src]#cd Geo-IP-1.38

[root@test Geo-IP-1.38]# perl Makefile.PL && make && make install

[root@test src]# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

[root@test src]# gunzip GeoLiteCity.dat.gz

[root@test src]# cp GeoLiteCity.dat /usr/local/share/GeoIP/

[root@test src]# vi /etc/awstats/awstats.www.dayu360.com.conf

启用或添加以下选项:

LoadPlugin="tooltips"

LoadPlugin="decodeutfkeys"

LoadPlugin="geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat"

LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoLiteCity.dat"

 

[root@test awstats]# perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=www.dayu360.com –update

更新awstats数据库(即web页面显示的内容)

 

 

当登陆到awstatsweb界面时出现提示:

Error: Access to statistics is only allowed from an authenticated session to authenticated users.

则需把/etc/awstats/awstats.www.123.com.conf中:

              AllowAccessFromWebToAuthenticatedUsersOnly=0

 

访问web页:

http://192.168.0.80/awstats/awstats.pl?config=www.123.com

 

以上完成了基本设置,下面进行一些高级设置:

1)不同的日志格式对应不同的日志格式的设置:

一、若对运行在apache上的网站产生的日志(combined格式)进行分析则在/etc/awstats/awstats.www.123.com.conf文件中配置

LogType=W

LogFormat=1

二、若要对运行在nginx上的网站产生的日志进行分析,首先需要在nginx配置文件nginx.conf中更改产生日志的格式:

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  logs/access.log  main;

然后在/etc/awstats/awstats.www.123.com.conf文件中配置

LogType=W

LogFormat=1

三、若nginx日志格式为:

log_format  main  '$remote_addr - $remote_user [$time_local] $request '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent"';

access_log  logs/access.log  main;

则在/etc/awstats/awstats.www.123.com.conf文件中配置

LogType=W

LogFormat=%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"

注:网上某些文章的nginx.conflog_format后面加了$http_x_forwarded_for(来源ip),然而其在/etc/awstats/awstats.www.123.com.conf文件中配置还是:

LogFormat=%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot",则因为缺少对应关系而使得awstats报错。

可以通过修改nginx的日志格式(把$http_x_forwarded_for去掉)即可。

最后注意:通过测试发现%methodurl字段必须对应GET的日志,若有POST的日志或“-”则会报错。

 

 

 

 

Sftp自动上传日志:

Apache服务器:

useradd -u 1000 httplog -d /home/httplog/

passwd httplog

awstat 服务器:

创建get日志的脚本

vi /usr/local/shell/get_weblog.sh

#!/bin/sh

export WEB1=172.16.0.115;

export WEB2=172.16.0.116;

export WEB3=172.16.0.117;

export USER=httplog;

export PASS="bdGhS3EI4dSH86QBXjV9";

export CPATH="/home/httpdlog/`date +%Y`/`date --date='1 days ago' +%m`/"

export web1="web1.access.`date --date='1 days ago' +%Y%m%d`.log"

export web2="web2.access.`date --date='1 days ago' +%Y%m%d`.log"

export web3="web3.access.`date --date='1 days ago' +%Y%m%d`.log"

export SPATH="/opt/weblogs/`date +%Y`/`date --date='1 days ago' +%m`/"

echo "sftp start";

 

if [ ! -d $SPATH ]; then

mkdir -p $SPATH; fi

 

lftp -u ${USER},${PASS} sftp://${WEB1}

lcd $SPATH

get $CPATH/$web1

open sftp://${USER}:${PASS}@$WEB2

get $CPATH/$web2

open sftp://${USER}:${PASS}@$WEB3

get $CPATH/$web3

bye

EOF

echo "GET WEB LOG DONE!!!";

 

创建awstat更新脚本

vi /usr/local/shell/awstat-update.sh

#!/bin/bash

configfiles="www"

#configfiles="www bbs buy"

domain=123.com

command=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

for conf in ${configfiles};

do

        ${command} -update -config=${conf}.${domain} -Databasebreak=month;

        ${command} -update -config=${conf}.${domain} -Databasebreak=day;

done

 

日历显示cgi

vi /usr/local/awstat/wwwroot/cgi-bin/calendar.pl

#!/usr/bin/perl

 

@domain_allow=("www");

#@domain_allow=("www","prom","buy","tag","blog","member");

$site=$ENV{"QUERY_STRING"};

if ($site eq ""){

        $site="www";

}else{

        $reject=1;

        foreach $sub_domain (@domain_allow){

                if ($sub_domain eq $site){

                        $reject=0;

                }

        }

}

# The awstats config file name

$CONFIG=$site.".123.com";

 

### Begin program ###

 

@now=localtime(time);

$today_day=$now[3];

$today_month=$now[4]+1;

$today_year=$now[5]+1900;

 

@yesterday=localtime(time-3600*24);

$ytd_day=$yesterday[3];

$ytd_month=$yesterday[4]+1;

$ytd_year=$yesterday[5]+1900;

 

$lastmonth=$today_month-1;

$lastmonth_year=$today_year;

if($lastmonth

{

        $lastmonth=1;

        $lastmonth_year=$today_year-1;

}

$lastyear=$today_year-1;

 

print "Content-type: text/html\n\n";

print "\n";

if ($reject==1){

        print "subdomain:'$site' is not accepted, please contact admin";

}else{

        print "Choose Subdomain:

        foreach $subdomain (@domain_allow){

                if($subdomain eq $site) {

                        $selected="selected='selected'";

                }else{

                        $selected="";

                }

                print "";

        }

 

        print "
";

        print "Today ";

        print "Yesterday ";

        print "ThisMonth ";

        print "LastMonth ";

        print "ThisYear ";

        print "LastYear ";

        print "\n


\n";

 

        printCal($today_year, $today_month);

        print "\n
\n";

        printCal($lastmonth_year, $lastmonth);

}

print "\n


\n";

 

##### Methods ######

 

sub getLink

{

        my($year, $month, $day)=@_;

        $query="";

        if($day)

        {

                $query="DatabaseBreak=day&day=${day}&month=${month}&year=${year}";

        }

        elsif($month)

        {

                $query="month=${month}&year=${year}";

        }

        elsif($year)

        {

                $query="year=${year}&month=all";

        }

        return "awstats.pl?config=${CONFIG}&$query";

}

 

sub printCal

{

my($y, $m)=@_;

open(CAL, "cal $m $y |");

@days = ;

close(CAL);

 

$month = $days[0];

$month=~ s/\s\s\s*//g;

$mbg="";

if($m==$today_month && $y==$today_year)

{

        $mbg="bgcolor='#ffaaaa'";

}

print "

\n";

foreach $dy (split(/ /, $days[1]))

{

        print "

";

}

print "

\n";

shift(@days);

shift(@days);

foreach $line (@days)

{

        chomp $line;

        $line =~ s/^\s+//;

        $line =~ s/\s+$//;

        print "

";

        foreach $d (split(/\s+/, $line))

        {

                $bg="";

                if($d==$today_day && $m==$today_month && $y==$today_year)

                {

                        $bg="bgcolor='#ffaaaa'";

                }

                print "

";

        }

        print"

\n";

}

print "

$month
$dy
$d
\n";

}

chmod +x /usr/local/awstat/wwwroot/cgi-bin/calendar.pl

Awstats 配置详解

Awstats 6.9.5默认即为GBK编码,改为UTF-8后部分搜索词乱码按照网上所述方式未能解决,GBK状态即无乱码

修改awstats pagecodeGBK

cd /usr/local/awstats/wwwroot/cgi-bin/lang

cp awstats-cn.txt awstats-cn-gbk.txt

vi awstats-cn-gbk.txt

PageCode=utf-8

修改为

PageCode=GBK

iconv -f UTF-8 -t GBK awstats-cn-gbk.txt > awstats-cn.txt

 

添加QQ IP

wget http://blog.pcware.cn/downloads/ip_geo_qqwry.zip

wget http://www.ieasy.org/download/qqwry.pl

wget http://www.ieasy.org/download/qqhostinfo.pm

ip_geo_qqwry.zip qqwry.pl 任选其一

unzip ip_geo_qqwry.zip

chmod 755 ip_geo_qqwry.pl

mv ip_geo_qqwry.pl /usr/local/awstats/wwwroot/cgi-bin/

wget http://update.cz88.net/soft/qqwry.rar

wget http://packages.sw.be/unrar/unrar-3.9.10-1.el5.rf.x86_64.rpm

rpm -ivh unrar-3.9.10-1.el5.rf.x86_64.rpm

mkdir qqwry && cd qqwry

unrar e ../qqwry.rar

mkdir /usr/local/share/ip_geo/

mv QQWry.Dat /usr/local/share/ip_geo/

cd ..

mv qqhostinfo.pm /usr/local/awstats/wwwroot/cgi-bin/plugins/

vi /usr/local/awstats/wwwroot/cgi-bin/plugins/qqhostinfo.pm

require "${DIR}/plugins/qqwry.pl";

修改为:

require "/usr/local/awstats/wwwroot/cgi-bin/ip_geo_qqwry.pl";

解决Awstats GBK页面IP 物理地址乱码:

vi /usr/local/awstats/wwwroot/cgi-bin/ip_geo_qqwry.pl

注释掉以下两行

#use Encode;

#    $ip_geo_addr=decode("gbk",$ip_geo_addr);

附上ip_geo_qqwry.pl源码,以防下载链接失效

#/* Copyright (C) 2002-2009 Proguru.

#   changuoqiang[at]gmail[dot]com

#   http://blog.pcware.cn

#

#   The Source Code is free; you can redistribute it and/or

#   modify it under the terms of the GNU Lesser General Public

#   License as published by the Free Software Foundation; either

#   version 2.1 of the License, or (at your option) any later version.

#

#   The Source Code is distributed in the hope that it will be useful,

#   but WITHOUT ANY WARRANTY; without even the implied warranty of

#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

#   Lesser General Public License for more details.

#

#   You should have received a copy of the GNU Lesser General Public

#   License along with the KWinUI; if not, write to the Free

#   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA

#   02111-1307 USA.  */

#

#/*

# *  Jun 14,2009   

# */

 

#use Encode;

 

sub ipwhere{

        my $ip      = shift;

        my @ip      = split(/\./, $ip);

        my $ip_num  = $ip[0]*256**3 + $ip[1]*256**2 + $ip[2]*256 + $ip[3];

 

    #my $qqwry_dat="${DIR}/plugins/QQWry.Dat";

        my $qqwry_dat = "/usr/local/share/ip_geo/QQWry.Dat";

        open(INFILE, "$qqwry_dat");

        binmode(INFILE);

 

        my $first_index_of_begin_ip, $last_index_of_begin_ip;

        sysread(INFILE, $first_index_of_begin_ip, 4);

        sysread(INFILE, $last_index_of_begin_ip, 4);

 

        $first_index_of_begin_ip    = unpack("L",$first_index_of_begin_ip);

        $last_index_of_begin_ip     = unpack("L",$last_index_of_begin_ip);

        my $total_index_of_begin_ip = ($last_index_of_begin_ip - $first_index_of_begin_ip)/7 + 1;

 

    #binary search the begin ip

    my $begin_index, $end_index = $total_index_of_begin_ip;

    my $middle_index, $middle_ip, $middle_ip_num;

 

#    while(1){

#        if($begin_index >= $end_index-1){

#            last;

#        }

#        $middle_index = int(($end_index + $begin_index)/2);

#        seek(INFILE, $first_index_of_begin_ip + $middle_index*7, 0);

#        read(INFILE, $middle_ip, 4);

#        $middle_ip_num = unpack("L", $middle_ip);

#        if($ip_num

#            $end_index = $middle_index ;

#        } else {

#            $begin_index = $middle_index ;

#        }

#    }

 

    while($begin_index

 

        $middle_index = int (($end_index + $begin_index)/2);

        seek(INFILE, $first_index_of_begin_ip + 7*$middle_index, 0);

        read(INFILE, $middle_ip, 4);

        $middle_ip_num = unpack("L", $middle_ip);

 

        if($ip_num == $middle_ip_num){

            $begin_index = $middle_index;

            last;

        } elsif ($ip_num

            $end_index = $middle_index;

        } else {

            $begin_index = $middle_index;

        }

    }

 

    my $end_ip_index_offset, $end_ip, $end_ip_num, $end_ip_offset;

    $end_ip_index_offset = $first_index_of_begin_ip + 7*($begin_index) + 4;

    seek(INFILE, $end_ip_index_offset, 0);

    read(INFILE, $end_ip_offset, 3);

   

    $end_ip_offset = unpack("L", $end_ip_offset."\0");

    seek(INFILE, $end_ip_offset, 0);

    read(INFILE, $end_ip, 4);

    $end_ip_num = unpack("L", $end_ip);

 

    if($ip_num

        my $offset, $position_mode, $geo_country_mode_2_pos=0;

 

        $/="\0";

        read(INFILE,$position_mode,1);

 

        #position mode 1  

        if ($position_mode eq "\1") {

            read(INFILE,$offset,3);

            $offset = unpack("L",$offset."\0");

            seek(INFILE,$offset,0);

            read(INFILE,$position_mode,1);

        }

        #position mode 2

        if ($position_mode eq "\2") {

            read(INFILE,$offset,3);

            $geo_country_mode_2_pos = tell(INFILE);

            $offset = unpack("L",$offset."\0");

            seek(INFILE,$offset,0);

        } else {

            seek(INFILE,-1,1);

        }

        $ip_geo_country=;

 

        if($geo_country_mode_2_pos != 0){

            seek(INFILE, $geo_country_mode_2_pos, 0);

        }

 

        #geo local, geo local only position mode 2

        read(INFILE,$position_mode,1);

        if($position_mode eq "\2") {

            read(INFILE,$offset,3);

            $offset = unpack("L",$offset."\0");

            seek(INFILE,$offset,0);

        } else {

            seek(INFILE,-1,1);

        }

        $ip_geo_local=;

    } else{

        $ip_geo_country = "未知数据";

    }

 

        chomp($ip_geo_country, $ip_geo_local);

        $/="\n";

        close(INFILE);

 

        my $ip_geo_addr="$ip_geo_country $ip_geo_local";

        $ip_geo_addr =~ s/CZ88\.NET//isg;

#    $ip_geo_addr=decode("gbk",$ip_geo_addr);

 

        return $ip_geo_addr;

}

 

1;

 

更新IP库脚本:

# Task file of update IP database in [crontab]

TMP_PATH="/tmp/ipdata"

Geo_PATH="/usr/local/share/GeoIP/"

Qip_PATH="/usr/local/share/ip_geo/"

 

#Last file stat

stat /usr/local/share/GeoIP/GeoLiteCity.dat     >>      /var/log/ipdata.log

stat /usr/local/share/GeoIP/GeoIP.dat           >>      /var/log/ipdata.log

stat /usr/local/share/ip_geo/QQWry.Dat          >>      /var/log/ipdata.log

 

 

mkdir $TMP_PATH

cd $TMP_PATH

#

/usr/bin/wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz

/usr/bin/wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

/usr/bin/wget http://update.cz88.net/soft/qqwry.rar

#--> end of download

/bin/tar zxf GeoIP.tar.gz

/usr/bin/gzip -df GeoLiteCity.dat.gz

/usr/bin/unrar e qqwry.rar

mv -f GeoIP-*/data/GeoIP.dat $Geo_PATH

mv -f Geo*.dat $Geo_PATH

mv -f QQWry.Dat $Qip_PATH

cd ..

rm -rf $TMP_PATH

#New file stat

stat /usr/local/share/GeoIP/GeoLiteCity.dat     >>      /var/log/ipdata.log

stat /usr/local/share/GeoIP/GeoIP.dat           >>      /var/log/ipdata.log

stat /usr/local/share/ip_geo/QQWry.Dat          >>      /var/log/ipdata.log

 

 

 

 

 

改进:

Apache Server使用如下脚本处理日志

策略: crontab每天执行此脚本,自动备份前一天日志,并删除一周前的未压缩日志,30天前的压缩日志

#!/bin/sh

HOST=web1

LOG_PATH="/home/httpdlog/`date +%Y`/`date --date='1 days ago' +%m`/"

BAK_PATH="/opt/backup/weblog/`date +%Y`/`date --date='1 days ago' +%m`/"

YESTERDAY=`date --date='1 days ago' +%Y%m%d`

BAK_FILE=$HOST-$YESTERDAY.tgz

LOG_FILE=$HOST.access.$YESTERDAY.log

 

if [ ! -d $BAK_PATH ]; then

mkdir -p $BAK_PATH; fi

 

tar zcfP $BAK_PATH/$BAK_FILE $LOG_PATH/$LOG_FILE

find /opt/backup/ -mtime +30 -name "*.log" -exec rm -rf {} \;

find /opt/backup/ -depth  -empty -type d -exec rmdir -p {} \;

 

find /home/httpdlog/ -mtime +7 -name "*.log" -exec rm -rf {} \;

find /home/httpdlog/ -depth -empty -type d -exec rmdir -p {} \;

 

echo "done!"

 

Awstats Server

cat get_weblog_tgz.sh

#!/bin/sh

export WEB1=172.16.0.115;

export WEB2=172.16.0.116;

export WEB3=172.16.0.117;

export USER=httplog;

export PASS="bdGhS3EI4dSH86QBXjV9";

export CPATH="/opt/backup/weblog/`date +%Y`/`date --date='1 days ago' +%m`/"

export web1="web1-`date --date='1 days ago' +%Y%m%d`.tgz"

export web2="web2-`date --date='1 days ago' +%Y%m%d`.tgz"

export web3="web3-`date --date='1 days ago' +%Y%m%d`.tgz"

export SPATH="/opt/weblogs/`date +%Y`/`date --date='1 days ago' +%m`/"

echo "sftp start";

 

if [ ! -d $SPATH ]; then

mkdir -p $SPATH; fi

 

lftp -u ${USER},${PASS} sftp://${WEB1}

lcd $SPATH

get $CPATH/$web1

open sftp://${USER}:${PASS}@172.16.0.116

get $CPATH/$web2

open sftp://${USER}:${PASS}@172.16.0.117

get $CPATH/$web3

bye

EOF

echo "GET WEB LOG DONE!!!";

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template