AWStats

AWStats 通过分析 access log 生成访问数据。

Ubuntu 20.04 上安装 AWStats,使用 Nginx 作为服务器。

安装

sudo apt install awstats libgeoip-dev php-fpm

sudo cpan 的命令行中运行 install Geo::IP

配置

AWStats

/etc/awstats/awstats.conf.local 中加入配置

LogFile="/var/log/nginx/access.log"
LogFormat=1
LoadPlugin="geoip GEOIP_STANDARD /usr/share/GeoIP/GeoIP.dat"

为一个站点建立它的配置,文件为 /etc/awstats/awstats.$HOST.conf,如 /etc/awstats/awstats.example.com.conf。在其中加入

Include "/etc/awstats/awstats.conf"
LogFile="/usr/share/awstats/tools/logresolvemerge.pl /var/log/nginx/example.com/access.log /var/log/nginx/example.com/access.log.1 |"
SiteDomain="wiki.ruo-chen.wang"

Nginx

每个站点的日志

对应于站点配置中的 log path,在 example.com 的 Nginx 配置中加入

access_log /var/log/nginx/example.com/access.log

目录不存在则要创建

sudo mkdir /var/log/nginx/example.com

将此 log 加入 logrotate 配置中,把 /etc/logrotate.d/nginx 第一行的路径改为

/var/log/nginx/*/*.log /var/log/nginx/*.log

其它配置

将以下内容写入 /etc/nginx/cgi-bin.php [1]

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a file to write to
);
$newenv = $_SERVER;
$newenv["SCRIPT_FILENAME"] = $_SERVER["X_SCRIPT_FILENAME"];
$newenv["SCRIPT_NAME"] = $_SERVER["X_SCRIPT_NAME"];
if (is_executable($_SERVER["X_SCRIPT_FILENAME"])) {
   $process = proc_open($_SERVER["X_SCRIPT_FILENAME"], $descriptorspec, $pipes, NULL, $newenv);
   if (is_resource($process)) {
       fclose($pipes[0]);
       $head = fgets($pipes[1]);
       while (strcmp($head, "\n")) {
           header($head);
           $head = fgets($pipes[1]);
       }
       fpassthru($pipes[1]);
       fclose($pipes[1]);
       fclose($pipes[2]);
       $return_value = proc_close($process);
   } else {
       header("Status: 500 Internal Server Error");
       echo("Internal Server Error");
   }
} else {
   header("Status: 404 Page Not Found");
   echo("Page Not Found");
}
?>

awstats.example.com 的配置:

server {
    server_name awstats.example.com;
    access_log off;
    location ^~ /awstats-icon {
        alias /usr/share/awstats/icon/;
    }
    location ~ ^/([a-z0-9-_\.]+)$ {
        return 301 $scheme://awstats.example.com/cgi-bin/awstats.pl?config=$1;
    }
    location ~ ^/cgi-bin/.*\.(cgi|pl|py|rb) {
        gzip off;
        include       fastcgi_params;
        fastcgi_pass  unix:/var/run/php/php-fpm.sock;
        fastcgi_index cgi-bin.php;
        fastcgi_param SCRIPT_FILENAME    /etc/nginx/cgi-bin.php;
        fastcgi_param SCRIPT_NAME        /cgi-bin/cgi-bin.php;
        fastcgi_param X_SCRIPT_FILENAME  /usr/lib/$fastcgi_script_name;
        fastcgi_param X_SCRIPT_NAME      $fastcgi_script_name;
        fastcgi_param REMOTE_USER        $remote_user;
    }
}

生成数据

sudo /usr/lib/cgi-bin/awstats.pl -config=example.com -update

如果配置正确,数据会生成到 /var/lib/awstats 下。访问 https://awstats.example.com/example.com 即可看到结果。

使用以下命令更新所有的站点

/usr/share/doc/awstats/examples/awstats_updateall.pl now -awstatsprog=/usr/lib/cgi-bin/awstats.pl

写一个 cron job 每两小时更新一次 sudo crontab -u root -e

30 */2 * * * /usr/share/doc/awstats/examples/awstats_updateall.pl now -awstatsprog=/usr/lib/cgi-bin/awstats.pl

外部链接

参考资料