Nginx配置Awstats分析Nginx日志笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

1、修改Nginx日志格式:

1
2
3
4
5
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库

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


4、安装Awstats

1
2
3
4
5
6
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、运行脚本生成配置

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

脚本交互1:

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

脚本交互2:

1
2
3
4
Do you want me to build a new AWStats config /profile  
file  (required  if  first  install ) [y /N ]
 
输入Y创建一个新的统计配置文件。

脚本交互3:

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

脚本交互4:

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

后面的直接按回车就可以


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

1
2
3
4
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

1
2
cpan> install  FCGI
cpan> install  FCGI::ProcManager

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/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  ($@) {
         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 is
not executable by this process.\n";
             }
         }
}

7.1.3、授权:

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

7.1.4、启动:

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

7.1.5、授权socker让Nginx调用:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                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增加虚拟主机:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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数据文件:

1
/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

wKiom1cR4rzxS29dAADm-KvCiOQ099.png


第二种办法:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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静态数据文件:

1
/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

wKioL1cR42mA37REAAD25PNqsss811.png


8、添加定时任务:

1
2
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
本文转自运维笔记博客51CTO博客,原文链接 http://blog.51cto.com/lihuipeng/1764467如需转载请自行联系原作者

lihuipeng
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
22天前
|
JavaScript Java 应用服务中间件
|
16天前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
|
2月前
|
应用服务中间件 nginx
nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
【8月更文挑战第27天】nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
39 6
|
2月前
|
存储 分布式计算 大数据
【Flume的大数据之旅】探索Flume如何成为大数据分析的得力助手,从日志收集到实时处理一网打尽!
【8月更文挑战第24天】Apache Flume是一款高效可靠的数据收集系统,专为Hadoop环境设计。它能在数据产生端与分析/存储端间搭建桥梁,适用于日志收集、数据集成、实时处理及数据备份等多种场景。通过监控不同来源的日志文件并将数据标准化后传输至Hadoop等平台,Flume支持了性能监控、数据分析等多种需求。此外,它还能与Apache Storm或Flink等实时处理框架集成,实现数据的即时分析。下面展示了一个简单的Flume配置示例,说明如何将日志数据导入HDFS进行存储。总之,Flume凭借其灵活性和强大的集成能力,在大数据处理流程中占据了重要地位。
38 3
|
2月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
2月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
2月前
|
算法 关系型数据库 程序员
第一周算法设计与分析:A : log2(N)
这篇文章介绍了解决算法问题"输入一个数N,输出log2N(向下取整)"的三种编程思路,包括使用对数函数和幂函数的转换方法,以及避免浮点数精度问题的整数逼近方法。
|
监控 应用服务中间件 数据库
|
应用服务中间件 数据库 开发工具
下一篇
无影云桌面