GoAccess zum protokollieren der Besucher nutzen

Ich habe nach einer Alternative gesucht, um die Besucher auf meinem Blog zu protokollieren. Matomo und Jetpack haben zu ungenaue Daten angezeigt. Nun habe ich eine schöne Alternative gefunden, die auch noch Open-Source und DSGVO konform ist. Die Daten stammen aus dem Nginx Access Protokoll. Die IP-Adresse wird anonymisiert und es ist außerdem möglich, sich dies in einem ansprechenden Frontend anzeigen zu lassen. Dieses ist natürlich Passwort geschützt. Die Lösung heißt für mich GoAccess.

Hier meine Anleitung. Vorausgesetzt wird das Nginx oder Apache als Reverse Proxy genutzt wird.

Installation von GoAccess

Damit wird die letzte Version (1.7) installiert. goaccess ist zwar im Debian Repo vorhanden installiert aber eine alter Version (1.4) Deswegen dieser Weg.

wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccess

Überprüfen solltet ihr die Installation auf die neuste Version

GoAccess - 1.7.
For more details visit: https://goaccess.io/
Copyright (C) 2009-2022 by Gerardo Orellana
Build configure arguments:
  --enable-utf8
  --enable-geoip=mmdb

Danach sollten in einem Webverzeichnis, idealerweise unter /var/www ein paar Dateien abgelegt werden.

mkdir /var/www/serverstats
cd serverstats
wget
sudo nano goaccess.sh

In der soeben erstellten goaccess.sh wird folgender Code eingefügt. Dieser muss von euch dementsprechend anpassen. Ich habe extra für den WordPress Blog ein eigenes Log-File angelegt, um nur die Zugriffe auf diesen Blog zu protokollieren. Ich möchte natürlich wissen, was auf meinem Blog los ist, oder eben nicht. Damit ihr wisst wohin Nginx für den Blog protokolliert, seht ihr in der entsprechenden Nginx oder Apache2 Konfiguration. bei mir ist es /var/www/logs/nginx/access-blog.log

#!/bin/bash
set -x
cd /var/www/serverstats
WORKDIR=/var/www/serverstats/work
LOGS="/var/log/nginx/access-blog.log*"
rm --force $WORKDIR/*.*
cp $LOGS* $WORKDIR
gzip -d --force work/*.gz
cat work/access-blog.*  | \
    grep -v xmlrpc.php     | \
    grep -v wp-json        | \
    grep -v "adminer.php"  | \
    grep -v "robots.txt"   | \
    grep -v "app-ads.txt"  | \
    grep -v "ads.txt"      | \
    grep -v wp-login.php   | \
    grep -v "?author="     | \
    grep -v "wp-includes"  | \
    grep -v "wp-content"   | \
    grep -v "wp-admin"     | \
    grep -v api            | \
    grep -v ".well-known"  | \
    #grep -v "?local_ga_js=" | \
    goaccess  --anonymize-ip  \
               --persist \
                --ignore-crawlers \
                 --hide-referrer=dasnetzundich.de \
                    --db-path=/var/www/serverstats/db -o /var/www/serverstats/index.html  --log-format=COMBINED

Erklärung

Die gesamte Ausgabe endet dann in der index.html die mit dem System User www-data gehören muss. Mit zcat -f werden verschiedene Log-Files zusammengefasst und in das Unterverzeichnis work entpackt.

Mit grep -v werden bestimmte Endungen und Pfade herausgenommen, denn der Zugriff darauf ist nicht wirklich von Bedeutung, gerade bei der XMLRPC Datei sowie der Robots.txt. Mit der XMLRPC Datei werden Clients wie dem WordPress Client für Android und iOS Zugriff gewährt auf den Blog. Die Robots.txt ist nur interessant für Suchmaschinen.

Mit –anonymize-ip werden die letzten beiden Stellen der IP-Adresse anonymisiert. –ignore-crawler gibt an das Crawler nicht erfasst werden sollen in der Statistik und mit –hide-referrer wird die eigene Domain als Quelle nicht protokolliert.

Nun eine Nginx Datei erstellen mit folgendem Inhalt.

upstream php_serverstats_dasnetzundich_de {
    server unix:/var/run/php/php8.1-fpm.sock;
    server unix:/var/run/php/php7.4-fpm.sock backup;
}
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             serverstats.dasnetzundich.de;
    set                     $base /var/www/serverstats;
    root                    $base/;
  # SSL
    ssl_certificate         /etc/letsencrypt/live/serverstats.dasnetzundich.de/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/serverstats.dasnetzundich.de/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/serverstats.dasnetzundich.de/chain.pem;

location / {
        try_files $uri $uri/ =404;
        auth_basic "Private Property";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    # additional config
    include nginxconfig.io/general.conf;
    # handle .php
    location ~ \.php$ {
        fastcgi_pass php_serverstats_dasnetzundich_de;
        include      nginxconfig.io/php_fastcgi.conf;
    }
}
# HTTP redirect
server {
    listen      80;
    listen      [::]:80;
    server_name .serverstats.dasnetzundich.de;
    location / {
        return 301 https://serverstats.dasnetzundich.de$request_uri;
    }
}

Abschließend fehlt noch ein Cronjob. Diesen am besten mit dem Root User anlegen. Wobei das Verzeichnis wie die Index.html drin ist dem User www-data gehören muss. Beim aktualisieren wird der User nicht auf root:root geändert.

*/15 * * * * sh /var/www/serverstats/goaccess.sh > 2&1

Danach sollte alles 15 Minuten die Statistik aktualisiert werden. Wie oft ihr die aktualisieren wollt bleibt euch selbst überlassen.

Weitere Infos dazu in den Docs von GoAccess sowie bei Github.