Nginx配置Awstats分析Nginx日志笔记

1、修改Nginx日志格式:

log_format json ‘$remote_addr - $remote_user [$time_local] "$request" ‘
             ‘$status $body_bytes_sent "$http_referer" ‘
             ‘"$http_user_agent" "$http_x_forwarded_for"‘;
             
access_log /data/nginx_logs/access.log json;

2、Nginx日志切割(shell脚本,略)

3、安装GeoIP库

yum -y install GeoIP GeoIP-devel perl-Geo-IP

4、安装Awstats

tar xvf awstats-7.4.tar.gz
mv awstats-7.4 /usr/local/awstats
cd /usr/local/
chown root:root -R awstats/
chmod +x /usr/local/awstats/tools/*.pl
chmod +x /usr/local/awstats/wwwroot/cgi-bin/*.pl

5、运行脚本生成配置

cd /usr/local/awstats/tools/
./awstats_configure.pl

脚本交互1:

Config file path (‘none‘ to skip web server setup):
因为在此我们使用的是nginx,所以填写none

脚本交互2:

Do you want me to build a new AWStats config/profile  
file (required if first install) [y/N]

输入Y创建一个新的统计配置文件。

脚本交互3:

Your web site, virtual server or profile name:  
> www.test.com 
在这输入自己的网站域名

脚本交互4:

Directory path to store config file(s) (Enter for default):  
> 
使用默认配置,生成配置文件

后面的直接按回车就可以

6、修改上面生成的配置文件/etc/awstats/awstats.app.mir.6wtx.com.conf

LogFile="/data/nginx_logs/cut_logs/%YYYY-24%MM-24%DD-24/
DirData="/data/awstats" 
LoadPlugin="geoip GEOIP_STANDARD /usr/share/GeoIP/GeoIP.dat"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /usr/share/GeoIP/GeoLiteCity.dat"

7、生成数据文件并配置Nginx,此处应该有两种办法:

一种是用fastcgi调用perl分析数据文件

一种是直接生成静态文件nginx解析

第一种办法:

7.1.1、安装FCGI和FCGI::ProcManager

cpan>install FCGI
cpan>install FCGI::ProcManager

7.1.2、创建fastcgi来执行perl:/usr/local/nginx/sbin/fcgi

#!/usr/bin/perl
use 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 scripts
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; };
eval q{exit};
if ([email protected]) {
        exit unless [email protected] =~ /^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 is
not executable by this process.\n";
            }
        }
}

7.1.3、授权:

chmod 755 /usr/local/nginx/sbin/fcgi

7.1.4、启动:

perl /usr/local/nginx/sbin/fcgi >/dev/null 2>&1

7.1.5、授权socker让Nginx调用:

chown www:www /usr/local/nginx/fastcgi_temp/perl_cgi-dispatch.sock

7.1.6、创建/usr/local/nginx/conf/fastcgi_params1

               fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               fastcgi_param QUERY_STRING     $query_string;
               fastcgi_param REQUEST_METHOD   $request_method;
               fastcgi_param CONTENT_TYPE     $content_type;
               fastcgi_param CONTENT_LENGTH   $content_length;
               fastcgi_param GATEWAY_INTERFACE CGI/1.1;
               fastcgi_param SERVER_SOFTWARE    nginx;
               fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
               fastcgi_param REQUEST_URI        $request_uri;
               fastcgi_param DOCUMENT_URI       $document_uri;
               fastcgi_param DOCUMENT_ROOT      $document_root;
               fastcgi_param SERVER_PROTOCOL    $server_protocol;
               fastcgi_param REMOTE_ADDR        $remote_addr;
               fastcgi_param REMOTE_PORT        $remote_port;
               fastcgi_param SERVER_ADDR        $server_addr;
               fastcgi_param SERVER_PORT        $server_port;
               fastcgi_param SERVER_NAME        $server_name;
               fastcgi_read_timeout 60;

7.1.7、Nginx增加虚拟主机:

server {
                listen      33333;
                server_name  xxxxxxxxxxx;
 
                 location / {
                        root   /data/awstats;
                        index  index.html index.htm;
                }
 
 
                location ~* ^/cgi-bin/.*\.pl$ {
                        root /usr/local/awstats/wwwroot;
                        fastcgi_pass unix:/usr/local/nginx/fastcgi_temp/perl_cgi-dispatch.sock;
                        fastcgi_index index.pl;
                        include  fastcgi_params1;
                        charset gb2312;
                }
                location ~ ^/icon/ {        # 图标目录
                        root   /usr/local/awstats/wwwroot;
                        index  index.html;
                        access_log off;
                        error_log off;
                }
        }

最后重启Nginx

7.1.8、生成awstats数据文件:

/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.test.com

7.1.9、打开URL查看效果:http://xxxxxxxxx:33333/cgi-bin/awstats.pl?config=www.test.com

第二种办法:

7.2.1、配置Nginx,不需要调用perl

server {
                listen       44444;
                server_name  xxxxxxxxxxx;
                root   /data/awstats;
                index  index.html;
                access_log off;
                error_log off;
                charset gb2312;

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

重启Nginx

7.2.2、生成awstats静态数据文件:

/usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=www.test.com -lang=cn -dir=/data/awstats -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

7.2.3、 打开URL查看效果:http://xxxxxxxxxx:44444/awstats.www.test.com.html

8、添加定时任务:

5 0 * * * /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.sunsky.com >/dev/null 2>&1
10 0 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=www.test.com -lang=cn -dir=/data/awstats -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl >/dev/null 2>&1
时间: 2024-10-10 01:40:08

Nginx配置Awstats分析Nginx日志笔记的相关文章

烂泥:利用awstats分析nginx日志

昨天把nginx的日志进行了切割,关于如何切割nginx日志,可以查看<烂泥:切割nginx日志>这篇文章. 今天打算分析下nginx日志,要分析nginx日志,我们可以通过shell脚本和第三方软件awstats进行分析,在此我们选择的是通过第三方软件awstats进行分析. 要使用awstats分析nginx日志,我们要安装awstats,而在安装awstats之前,我们需要先来介绍下awstats是什么? 一.awstats是什么 awstats是一个免费非常简洁而且强大有个性的基于Pe

AWStats分析Nginx访问日志

AWStats是在Sourceforge上发展很快的一个基于Perl的WEB日志分析工具. 它可以统计您站点的如下信息: 访问量(UV),访问次数,页面浏览量(PV),点击数,数据流量等 精确到每月.每日.每小时的数据 访问者国家 访问者IP Robots/Spiders的统计 访客持续时间 对不同Files type的统计信息 Pages-URL的统计 访客操作系统浏览器等信息 其它信息(搜索关键字等等) 下面是AWStats分析Nginx日志的操作步骤: 一.配置nginx日志格式 修改ng

awstats分析nginx日志文件

awstats分析nginx日志文件,将生成的结果(为txt文件)保存在/var/www/awstats目录下,通过apche来 显示生成的结果. nginx的域名为:www.a.com:80 LogFile="/usr/local/mybin/nginx/logs/access.log"  #nginx的日志文件路径 DirData="/var/www/awstats/" #awstats生成结果的保存路径 SiteDomain="www.a.com&q

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

nginx源码分析--nginx外部信号 命令参数

nginx命令行参数 不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置 -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的. -t 不运行,而仅仅测试配置文件.nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件. -v 显示 nginx 的版本. -V 显示 nginx 的版本,编译器版本和配置参数. nginx控制信号 可以使用信号系统来控制主进程.默认,nginx 将其主进程的 pid 写入到 /u

Nginx源码分析 - Nginx启动以及IOCP模型

Nginx 源码分析 - Nginx启动以及IOCP模型 版本及平台信息 本文档针对Nginx1.11.7版本,分析Windows下的相关代码,虽然服务器可能用linux更多,但是windows平台下的代码也基本相似 ,另外windows的IOCP完成端口,异步IO模型非常优秀,很值得一看. Nginx启动 曾经有朋友问我,面对一个大项目的源代码,应该从何读起呢?我给他举了一个例子,我们学校大一大二是在紫金港校区,到了 大三搬到玉泉校区,但是大一的时候也会有时候有事情要去玉泉办.偶尔会去玉泉,但

使用awstats分析nginx日志

1.awstats介绍 本文主要是记录centos6.5下安装配置awstats,并统计nginx访问日志 1.1 awstats介绍 awstats是一款日志统计工具,它使用Perl语言编写,可统计的日志类型包括appache,nginx,ftp,mail等,awstats对nginx日志统计非常详细,如统计项 按参观时间:  按月历史统计   按日期统计   按星期   每小时浏览次数 按参观者:  国家或地区   城市   IP   最近参观日期   无法反解译的IP地址   搜索引擎网站

[Nginx配置系列] 基于Nginx Geo与 Nginx Map模块进行Nginx白名单配置

一.简介 在通常情况下,使用 nginx 基于 ip 限制访问请求频率等限制内容,我们会需要对特定ip进行限制排除操作,因此本文引入了基于nginx geo 与 nginx map 进行此类情景相关配置: 在没有人为操作删除的情况下(without-http_geo_module),nginx默认模块中已经加载了ngx-http-geo-module相关内容: ngx-http-geo-module可以用来创建变量,变量值依赖于客户端 ip 地址; ngx-http-map-module可以基于

Nginx源码分析—nginx的配置

Nginx都是一个master进程来管理多个worker进程.Worker进程的数量与服务器上的CPU核心数相等.Master是管理worker,接受外部信号,worker进程之间通过共享内存.原子操作实现通信和同步. 任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务. 不同worker进程之间处理并发请求几乎没有同步锁的限制,(可以参考进程间通信机制中的介绍) 实现负载均衡使用的是负载均衡锁,accept_mutex,每一个wo