Ghostboard pixel

Webseitenbesucher mit Goaccess erfassen

Webseitenbesucher mit Goaccess erfassen

Habe heute eine super einfache und schlanke Möglichkeit gefunden die Besucher zu loggen, die sich so auf meinem Blog rumtreiben. Matomo ist bei mir leider Gottes ausgestiegen. Finde aber dort keine Lösung. Nach ein wenig suchen nach Alternativen habe ich eine tolle Anleitung gefunden. Credits gehen nur an den Ersteller dessen. Hier zu erstmal die Quelle, sowie eine weitere.

Eins direkt zur Erklärung um was es hier geht. Goaccess ist ein Programm für Linux, das dazu verwendet werden kann, um Webserver-Log-Dateien auszuwerten. Dabei ist es völlig egal, welchen Webserver man verwendet, denn Goaccess unterstützt sowohl Apache als auch Nginx und Amazon Cloudfront. Es kann auch verschiedene Protokollformate wie CLF, ELF und JSON verarbeiten.

Eine coole Funktion von Goaccess ist, dass man die gesammelten Daten in verschiedenen Formaten exportieren kann, zum Beispiel als HTML, CSV oder JSON. Das macht es besonders nützlich für fortgeschrittene Nutzer.

Mit Goaccess kann man schnell wichtige Informationen über die Nutzung seiner Website sammeln, wie die Anzahl der Besucher, die Seitenaufrufe und die Verweildauer der Nutzer. Es gibt auch Filtermöglichkeiten, um bestimmte Teile der Log-Dateien anzuzeigen oder auszublenden.

Goaccess Panel mit ersten Nutzerdaten zu dasnetzundich.de
Ansicht der Nutzerstatistik generiert mit goaccess.

Nun die Anleitung auch auf Deutsch.

Zuerst muss nginx und apache-utils installiert sein. Aber ich gehe davon aus, dass das bereits geschehen ist. Vollständigkeitshalber trotzdem.

sudo su -
apt update && apt upgrade -y
apt install nginx certbot python3-certbot-nginx apache2-utils

Dann muss ein Verzeichnis erstellt werden, wo zum Schluss alles untergebracht wird, sowie die dazugehörige Nginx Konfiguration.


mkdir -p /var/www/serverstats
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/stats.domain.com
nano /etc/nginx/sites-available/stats.domain.com

In die /etc/nginx/sites-available/stats.domain.com muss folgendes rein.

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;
    }
    # handle .php
    location ~ \.php$ {
        fastcgi_pass php_serverstats_dasnetzundich_de;
    }
}
# subdomains redirect
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             *.serverstats.dasnetzundich.de;
    # 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;
    return                  301 https://serverstats.dasnetzundich.de$request_uri;
}
# HTTP redirect
server {
    listen      80;
    listen      [::]:80;
    server_name .serverstats.dasnetzundich.de;
    location / {
        return 301 https://serverstats.dasnetzundich.de$request_uri;
    }
}

Damit alles nur per SSL aufrufbar ist ein Zertifikat erstellen via Certbot.

Certbot -d stats.domain.com

Wenn das Zertifikat generiert ist, den Pfad in der Nginx Konfiguration eintragen und einen symlink zu sites-enabled erstellen unnschliessend den Webserver neu starten.

ln -s /etc/nginx/sites-available/stats.domain.com /etc/nginx/sites-enabled/stats.domain.com
nginx -t # Konfiguration überprüfen
service nginx restart

Installation von goaccess

Nun muss das Script erstellt werden dass dann per Cronjob die index.html aktualiert.

apt install goaccess

Geolocation herunterladen

cd /var/www/html/serverstats
wget https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb

Nun das Shell Script erstellen

nano /var/www/serverstats/generate-stats.sh
#!/bin/sh
zcat -f /var/log/nginx/access-blog.log* > /var/log/nginx/access-all.log
goaccess \
  --log-file=/var/log/nginx/access-all.log \
  --log-format=COMBINED \
  --exclude-ip=0.0.0.0 \
  --geoip-database=/var/www/serverstats/GeoLite2-City.mmdb \
  --ignore-crawlers \
  --real-os \
  --output=/var/www/serverstats/index.html
rm /var/log/nginx/access-all.log

Hier habe ich gegenüber der originalen Anleitung eine Abwandlung gemacht. Ich habe separate Access Files für jede Seite. Damit ich nur eine Seite Tracke und nicht alles Seiten in einem Log habe. Da kommt der Monk in mir durch. 🤪

Ich nutze dazu /var/log/nginx/access-blog.log. Aber je nachdem wie ihr das haltet, müsst ihr den Dateipfad anpassen.

Cronjob anlegen

Im Crontab muss nun das Shell Script eingetragen werden, damit sich die Statistik automatisch aktualisiert.

*/10 * * * * sh /var/www/serverstats/generate-stats.sh

Am besten direkt das Script manuell ausfüllen, damit schon einmal was vorhanden ist.

Jetzt sollte es laufen, aber es ist ungeschützt im Netz, was wiederum nicht so gut ist. Das Ganze muss mit einem Nutzernamen und Passwort eingerichtet werden. Dies geht folgendermaßen.

Gegen unbefugtes Ansehen der Statistik mit Passwort absichern.

Dazu einen neuen Nutzer anlegen und ein Passwort generieren mit diesem Befehl.

htpasswd -c /etc/nginx/.htpasswd stats

Beides ist anschließend in der .htpasswd zu finden. Damit dies auch genutzt werden kann, muss dies mit einer weiteren Location Angabe in der Nginx Datei hinterlegt werden.

location / {
     try_files $uri $uri/ =404;
     auth_basic "Private Property";
     auth_basic_user_file /etc/nginx/.htpasswd;
}

Danach Nginx neu starten. Ab sofort wird beim Aufrufen von stats.domain.com Nutzer und Passwort angefragt. Die Statistik wird jetzt kontinuierlich aktualisiert.

Bots usw. ausfiltern

Im Rohzustand wird alles geloggt, aber um einen realistischen Einblick in die Besucherzahlen zu bekommen, sollten Bots, Crawler, xmlrpc.php Aufrufe usw. nicht angezeigt werden. Habe dazu auf einem anderen Blog folgendes Script gefunden. Gegenüber dem Original habe ich dies an mein Set-up anpassen müssen.

#!/bin/sh
set -x
cd /var/www/serverstats/

WORKDIR=/var/www/serverstats/work
do
    echo Erstelle Statistik für Dasnetzundich.de
    LOGS=/var/log/nginx/access-blog.log*
    rm $WORKDIR/*.*
    cp $LOGS* $WORKDIR
    gzip -d work/*.gz
    cat work/access-blog.log  | \
        grep -v xmlrpc.php     | \
        grep -v wp-json        | \
#        grep -v "/category/"   | \
        grep -v "adminer.php"  | \
        grep -v "robots.txt"   | \
        grep -v "app-ads.txt"  | \
        grep -v "ads.txt"      | \
        grep -v wp-login.php   | \
#        grep -v "/feed"        | \
#        grep -v "?author="     | \
        grep -v "wp-includes"  | \
        grep -v "wp-content"   | \
        grep -v "wp-admin"     | \
        grep -v SemrushBot     | \
        grep -v DotBot         | \
        grep -v YandexBot      | \
        grep -v AhrefsBot      | \
        grep -v SeznamBot      | \
        grep -v Googlebot      | \
        grep -v msnbot         | \
        grep -v bingbot        | \
        grep -v Applebot       | \
        grep -v MJ12bot        | \
        grep -v YandexImages   | \
        grep -v DuckDuckGo-Favicons-Bot | \
        goaccess  -o /var/www/serverstats/index.html --geoip-database=/var/www/serverstats/GeoLite2-City.mmdb --log-format=COMBINED
done

Das Sript muss nun als Cronjob hinterlegt werden. Dann dürfte alles funktionieren und ihr bekommt eine aufgeräumte Statistik über die Besucherzahlen.

*/15 * * * * ./var/www/serverstats/remove-bots.sh >/dev/null 2>&1

Nun werde ich meine Matomo Installation einfrieren und nur noch diese Methode nutzen zur Erfassung der Nutzerzahlen.