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日志并进行多维度分析。
相关文章
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
238 0
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
374 90
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
119 23
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
|
7月前
|
SQL
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
607 3
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2391 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
189 9
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
404 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问