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日志并进行多维度分析。
相关文章
|
19天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
156 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
18天前
|
存储 SQL 监控
|
18天前
|
运维 监控 安全
|
21天前
|
监控 关系型数据库 MySQL
分析慢查询日志
【10月更文挑战第29天】分析慢查询日志
37 3
|
21天前
|
监控 关系型数据库 数据库
怎样分析慢查询日志?
【10月更文挑战第29天】怎样分析慢查询日志?
34 2
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1645 14
|
1月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
39 4
|
1月前
|
网络协议 应用服务中间件 nginx
FFmpeg错误笔记(一):nginx-rtmp-module推流出现 Server error: Already publishing
这篇文章讨论了在使用nginx-rtmp-module进行RTMP推流时遇到的“Server error: Already publishing”错误,分析了错误原因,并提供了详细的解决办法,包括修改nginx配置文件和终止异常的TCP连接。
148 0
FFmpeg错误笔记(一):nginx-rtmp-module推流出现 Server error: Already publishing
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
47 2
|
1月前
|
网络协议 Linux Windows
Rsyslog配置不同端口收集不同设备日志
Rsyslog配置不同端口收集不同设备日志
下一篇
无影云桌面