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日志并进行多维度分析。
相关文章
|
1月前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
242 15
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
1月前
|
存储 应用服务中间件 Linux
nginx配置证书和私钥进行SSL通信验证
nginx配置证书和私钥进行SSL通信验证
69 4
|
2月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
67 7
|
2月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
2月前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
116 5
|
2月前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
233 3
|
6天前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
21 5
图解MySQL【日志】——Redo Log
|
3月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1044 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。