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.
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.