GoAccess: Besucherstatistik ohne Tracking
Wer wissen will, wer die eigene Webseite besucht, muss keinen Analysedienst einbinden. GoAccess ist ein Open-Source-Werkzeug, das die Zugriffslogs des Webservers auswertet und daraus einen HTML-Bericht macht. Es kommt kein Skript auf die Seite, es entstehen keine Cookies und es sind keine Dritten beteiligt: Die Daten verlassen den Server nicht.
Was man sieht
| Feld im Bericht | Was es zeigt |
| Unique visitors per day | Besucher und Aufrufe pro Tag |
| Requested Files (URLs) | die meistgelesenen Seiten |
| Visitor Hostnames and IPs | wer da ist: die Adressen der Besucher |
| Operating Systems, Browsers, Time Distribution | Systeme, Browser und Uhrzeiten |
| Referring Sites | woher die Besucher kommen |
| Not Found URLs (404s) | tote Links, aber auch Scanner, die nach fremden Adminseiten suchen |
| HTTP Status Codes | Erfolgs- und Fehlermeldungen des Servers |
Einrichtung in fünf Schritten
Beispiel: Apache unter Debian, davor ein Reverse Proxy mit der Adresse 192.0.2.10.
1. Echte Besucher-IP im Log
Hinter einem Reverse Proxy sieht Apache als Absender immer nur den Proxy. Ohne diesen Schritt zeigt GoAccess einen einzigen Besucher. Abhilfe ist mod_remoteip: Es übernimmt die Adresse aus dem Header X-Forwarded-For, aber nur, wenn die Anfrage vom eigenen Proxy kommt.
a2enmod remoteip
# /etc/apache2/conf-available/remoteip.conf
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.0.2.10
a2enconf remoteip
systemctl reload apache2
Prüfen: Eine Anfrage von außen muss im access.log die eigene Adresse zeigen, nicht die des Proxys.
Nur den eigenen Proxy vertrauen. Würde man jede Adresse zulassen, könnte ein Besucher den Header X-Forwarded-For selbst setzen und sich im Log als beliebige Adresse ausgeben.
2. Installieren
apt install goaccess
3. Bericht erzeugen
Die aktuellen und die rotierten Logs zusammen einlesen. Bekannte Crawler ausblenden, eigene Adressen und den Proxy ausschließen:
ls -1tr /var/log/apache2/access.log* | xargs zcat -f | goaccess - \
--log-format=COMBINED --ignore-crawlers \
--exclude-ip=127.0.0.1 --exclude-ip=192.0.2.10 --no-progress \
-o /var/www/statistik/index.html
Mit --crawlers-only statt --ignore-crawlers entsteht ein zweiter Bericht nur mit Bots und Scannern. zcat -f liest gepackte und normale Dateien gleichermaßen.
4. Regelmäßig neu erzeugen
Das Kommando kommt in ein kleines Skript, das ein systemd-Timer stündlich startet. GoAccess braucht dafür nur Sekunden.
# /etc/systemd/system/goaccess-bericht.timer
[Unit]
Description=GoAccess-Bericht stuendlich erzeugen
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now goaccess-bericht.timer
Die zugehörige .service-Datei ist vom Typ oneshot und ruft das Skript auf. Ein Cronjob tut es auch.
5. Nur intern ausliefern
Der Bericht enthält IP-Adressen und gehört nicht ins öffentliche Webverzeichnis. Er liegt in einem eigenen Ordner und wird über einen nur intern erreichbaren VirtualHost ausgeliefert, den man per SSH-Tunnel aufruft:
# in ports.conf: Listen 127.0.0.1:8081
<VirtualHost 127.0.0.1:8081>
Alias /statistik /var/www/statistik
<Directory /var/www/statistik>
Require ip 127.0.0.1
Options -Indexes
</Directory>
</VirtualHost>
# am eigenen Rechner:
ssh -N -L 8081:127.0.0.1:8081 benutzer@server
# im Browser: http://localhost:8081/statistik/
Von außen muss die Adresse eine 404 liefern. Das gehört zum Test:
curl -s -o /dev/null -w "%{http_code}\n" https://beispiel.example/statistik/
Stolpersteine
- Dateiendung: Die Ausgabedatei muss auf
.html, .json oder .csv enden. Eine Zwischendatei mit anderer Endung bricht mit einer Fehlermeldung ab.
- Alte Logzeilen: Zeilen aus der Zeit vor
mod_remoteip tragen nur die Proxy-Adresse. Sie ergeben einen Scheinbesucher und werden mit --exclude-ip herausgefiltert. Echte Besucher gibt es erst ab Schritt 1.
- Eigene Besuche: Sie und alle Tests zählen mit. Wer sich ausblenden will, ergänzt
--exclude-ip mit der eigenen Adresse. Bei wechselnder Heim-IP hilft das nur zeitweise.
Grenzen
- Die Auswertung reicht nur so weit zurück, wie die Logs aufbewahrt werden. Bei Debian sind das standardmäßig 14 Tage (
logrotate).
- Ein Teil der Zugriffe kommt von Bots. Der Crawler-Filter fängt bekannte ab, ein Rest bleibt. Die Zahlen sind gröber als bei Analysediensten mit Skript.
- Ohne Zusatzdatenbank (GeoIP) gibt es keine Länderanzeige.
Alternativen
| Werkzeug | Technik | Wann? |
| GoAccess | wertet Logs aus, kein Skript | kleine Seiten, wenig Aufwand, kein Tracking |
| Matomo | PHP + MariaDB, Skript auf der Seite | viele Auswertungen nötig, eigener Server mit genug Arbeitsspeicher |
| Umami | Node.js + PostgreSQL, Skript auf der Seite | genauere Zahlen, schlank, eigener Container |
Datenschutz
Die IP-Adressen stehen ohnehin in den Serverlogs, neu ist nur die Auswertung. In die Datenschutzangaben gehört ein Hinweis auf Server-Logdateien: welche Daten, wie lange gespeichert und wofür. Der Bericht sollte nur intern erreichbar sein. Das ist keine Rechtsberatung.
Wer keine Fremdskripte einbindet, muss auch keine erklären. Log-Auswertung zeigt, wer da war, und die Daten bleiben auf dem eigenen Server.