Webalizer auf Logfiles loslassen

Ist der Website-Statistiker Piwik eine Nummer zu groß und das politisch-unkorrekte Google Analytics, das alle Daten zur Auswertung an den big brother in Kalifornien sendet, zu unheimlich? Dann kann man sich auch mit der Oldschool zufrieden geben, um die Logfiles des Apachen zu bändigen. Die Rede ist von einfachen Auswertungs-Programmen wie Analog, Awstats oder eben vom Webalizer, um den es hier gehen soll, weil er in Debian oder auch Ubuntu bequem per Paketmanagement ins System eingebunden wird und übrigens auch von Massenhostern wie Strato oder Host Europe eingesetzt wird oder wurde, um der Kundschaft ein paar Statistiken bereitzustellen. Mit etwas Planung und ein paar Anpassungen kann man den Webalizer sogar auf mehrere virtuelle Hosts (VHosts) loslassen.

Prinzipiell funktioniert Webalizer so: Das Tool wird auf ein Logfile losgelassen, wertet dieses aus und speichert das Ergebnis in Form eines Reports ab. Der Report besteht aus Grafiken (eye candy geht anders) und Statistiken und wird in Form von HTML-Seiten generiert, die sich dann über den Web-Browser betrachten lassen. Möchte man nicht der ganzen Welt seine Seitenabrufe bekannt machen, sollte man das Report-Verzeichnis tunlichst mit einem Passwort sichern.

Basis-Installation: Zunächst holen wir uns mit Root-Rechten Webalizer auf die Platte.

$ apt-get install webalizer

Webalizer wird nun auf Debian-Standards zugeschnitten samt dem Paket libgeoip1 zur Lokalisierung der geloggten Zugriffe installiert (getestet unter Debian Etch und Lenny) und erzeugt dabei

  • eine Konfigurationsdatei /etc/webalizer/webalizer.conf – ACHTUNG: eine Debian-Besonderheit ab Paket-Version 2.01.10-30, normalerweise liegt die Datei in /etc/webalizer.conf
  • laut Konfigurationsdatei liegt das auszuwertende Apache-Logfile unter /var/log/apache2/access.log.1
  • ein Script unter /etc/cron.daily/webalizer, das eine tägliche Auswertung via Cron-Job unter Berücksichtigung aller Konfigurationsdateien im Verzeichnis /etc/webalizer anstösst.
  • ein Verzeichnis zum Speichern seiner Report-Dateien innerhalb der Web-Root, bei Debian normalerweise /var/www/webalizer

Dank Cron-Job wird Webalizer also nach der Installation täglich aufgerufen, und das Zusammenspiel mit Logrotate, das für das Rotieren der  Apache-Logs zuständig ist, funktioniert ebenfalls: Webalizer wird immer nach Logrotate ausgeführt (simpler Grund: die Konfigurations-Dateien in /etc/cron.daily werden in alphabetischer Reihenfolge ausgeführt) und stürzt sich nicht auf die Datei access.log, sondern auf die gerade rotierte Datei access.log.1. Bei der Gelegenheit sollte die Logrotate-Konfigurationsdatei des Apachen /etc/logrotate.d/apache2 gleich auch noch praxisnäher angepasst werden:

  • Aus weekly wird daily – die Logfiles sollen täglich rotiert werden, damit sie nicht zu groß werden.
  • Das standardmäßig konfigurierte rotate 52 (Logdatei wird 52 Mal rotiert, bis sie gelöscht wird) grenzt an Datensammelwut und sollte unbedingt heruntergesetzt werden – für unseren Webalizer brauchen wir jedenfalls nur eine Rotation. Datenschutz ist – das nur am Rande dieses Postings – ohnehin ein heikles Thema, da Apache standardmäßig komplette IP-Adressen loggt.

Virtuelle Hosts. Zumeist lohnt sich ein eigener Webserver im Internet erst, wenn er gleich mehrere Websites – von Freunden, Kollegen, Kunden, wie auch immer – serviert. Der Apache erlaubt deshalb die Konfiguration von virtuellen Hosts; virtuell deshalb, weil alle vom selben Webserver ausgeliefert werden und sich eine IP-Adresse teilen.

Die hier beschriebene Webalizer-Konfiguration geht davon aus, dass der Server wie folgt organisiert ist (dies ist ein Vorschlag; man kann es – wie immer unter Linux – auch anders machen):

  • Apache serviert Webseiten für mehrere Vhosts aus den Verzeichnissen /var/www/vhost1/, /var/www/vhost2/ usw
  • Für jeden virtuellen Host werden die Logfiles separat abgelegt, und zwar jeweils ein Access-Log und ein Error-Log
  • Für die Logfiles gilt folgende Namenskonvention: Für vhost1 – vhost1-access.log, vhost1-error.log. Für vhost2 – vhost2-access.log, vhost2-error.log, usw.

An dieser Stelle folgt nun kein Tutorial, wie man virtuelle Hosts beim Apache2 konfiguriert. Nur soviel: Im Verzeichnis /etc/apache/sites-available/ muss für jeden virtuellen Host eine eigene Konfigurationsdatei angelegt und zur Aktivierung in /etc/apache/sites-enabled/ per Simlink verknüpft werden. Flink erledigt das der Befehl a2ensite vhostx. Ein Reload des Webservers liest dann die neue Konfiguration ein. Für unseren Beispiel-vhost1 sehen die relevanten Zeilen dann so aus:

<VirtualHost *>
DocumentRoot /var/www/vhost1

ServerName www.vhost1name.de
ServerAlias vhost1name.de
[...]
ErrorLog /var/log/apache2/vhost1-error.log
CustomLog
/var/log/apache2/vhost1-access.log combined
</VirtualHost *>

Konfigurationsdateien anlegen. Um Webalizer die virtuellen Hosts bekannt zu machen, wird nun für jeden Vhost in /etc/webalizer/ eine eigene Konfigurationsdatei vhost1.conf, vhost2.conf usw. angelegt. Ein guter Startpunkt ist die standardmäßig generierte webalizer.conf. Man kopiert sie in eine neue vhost1.conf-Datei und passt deren Inhalt an. Wichtig ist, Webalizer mitzuteilen,

  • wo das von Apache generierte und auzuwertende Logfile zu finden ist
  • in welches Verzeichnis die HTML-Reportdateien zu speichern sind und
  • dass die Reports inkrementell erzeugt werden, d.h. Webalizer merkt sich die Auswertungsergebnisse der Vorwoche, der Vor-Vorwoche usw.

Die relevanten Änderungen in der Konfigurationsdatei für vhost1 sehen dann wie folgt aus:

LogFile /var/log/apache2/vhost1-access.log.1
OutputDir /var/www/stats/vhost1
Incremental yes

Entsprechend müssen Sie für jeden Ihrer virtuellen Hosts eine Konfigurationsdatei in /etc/webalizer/ mit der Endung *.conf erzeugen und das in OutputDir angegebene Reportverzeichnis anlegen, damit Webalizer hineinschreiben kann. Damit Sie die HTML-Seiten der generierten Reports später in Ihrem Browser unter der Adresse http://host.domain/stats/vhost1 betrachten können, muss das Verzeichnis zudem für den Webserver lesbar sein – wenn der Apache in einer Debian-Standard-Installation als User www-data unterwegs ist, kann man ihm das Verzeichnis auch gleich übereignen:

$ mkdir /var/www/stats/vhost1
$ chown www-data:www-data /var/www/stats/vhost1/

Wer nicht das Risiko eingehen will, das fremde Besucher auf die Statistiken stoßen, stattet das Verzeichnis stats mit einem Vorhängeschloss in Form eines Passwort-Schutzes aus. Beim Apache-Webserver erledigt dies die Basic Authentication.

Länder-Statistik. Der Apache-Webserver kann fast alles, auch IP-Adressen auflösen, indem der dazu passende Hostname ermittelt wird. Diese zeitraubende Tatigkeit möchte man sich im Live-Betrieb aber sparen und schaltet deshalb den HostnameLookup aus. Weil damit nur die IP-Adresse im Log auftaucht, kann der Webalizer nicht die zu den Abrufen passenden Länder ermitteln und gibt nur eine Tortengrafik mit 100% „Unbekannte Adressen“ aus. Dem lässt sich am schnellsten abhelfen, indem man die Archivdatei ftp://ftp.mrunix.net/pub/webalizer/geodb/geodb-latest.tgz herunterlädt und entpackt. Sie enthält die Datenbank GeoDB.dat, die man auf dem Server in das (zu erstellende) Verzeichnis /usr/share/GeoDB verschiebt. Anschließend noch in der/den oben angelegten Konfigurationsdatei(en) die Zeile „GeoDB yes“ einfügen. Dann klappt die Auflösung. Weitere Hinweise stehen in der dem Archiv ebenfalls beiliegenden Textdatei GEODB.README,

Automatisierung. Um die automatisierte Abarbeitung von Aufträgen zu bestimmten Zeiten kümmert sich in Linux der Cron-Dämon. Wir wünschen uns von ihm, dass er Webalizer automatisch jede Nacht zwecks Generierung der Reports für jeden unserer Vhosts startet. Debian hat – siehe oben – bei der Installation bereits ein Script /etc/cron.daily/webalizer angelegt, das bei jedem Aufruf im bekannten Verzeichnis /etc/webalizer/ nach Konfigurationsdateien Ausschau hält. Sodann wird eine Schleife durchlaufen, die Webalizer mit jeder gefundenen Konfigurationsdatei als Argument startet. Auf diese Weise werden für alle Vhosts, für die zuvor Konfigurationsdateien erstellt wurden, automatisiert die Reports geniert. Fertig!

Webalizer von Hand starten. Wirklich fertig? keine Konfigurationsfehler? Das wollen wir lieber mit eigenen Augen sehen. Um Webalizer mit einer bestimmten Konfiguration zu starten, geben wir ihm als Argument hinter dem -c-Flag die gewünschte Konfigurationsdatei an. Anhand der Rückmeldungen lässt sich sehen, ob alles glatt läuft:

$ webalizer -c /etc/webalizer/vhost1.conf
Webalizer V2.01-10 (Linux 2.6.9-023stab044.16-enterprise) locale: de_DE.utf8
Verwende Protokolldatei /var/www/logs/vhost1-access.log.1 (clf)
Using default GeoIP database
Erzeuge Dateien in /var/www/webalizer/vhost1
Rechnername für Bericht ist 'meinrechner'
Datei mit historischen Daten nicht gefunden...
Daten des letzten Programmlaufes nicht gefunden...
Erzeuge Bericht für February 2008
Erzeuge Zusammenfassung
Speichere historische Daten...
2277075 Einträge in 13,59 Sekunden, 167555/sec

Alles okay – beim ersten Durchlauf findet Webalizer natürlich noch keine historischen Daten, wertet aber das vorhandene Log aus.

Webalizer ohne Konfigurationsdatei. Sie können Webalizer auch direkt mit einem Apache-Logfile beliebiger Herkunft füttern, das sie lokal abgespeichert haben. Dazu rufen Sie Webalizer einfach mit dem Logfile als Argument auf und geben mit dem -o-Flag ein Ausgabe-Verzeichnis an (optional), wenn die Reportdateien nicht im aktuellen Verzeichnis laden sollen (standardmäßig):

$ webalizer /pfad/zum/access_log -o /pfad/zum/ausgabeverzeichnis

1 comment on “Webalizer auf Logfiles loslassen”

  1. Tolle Erklärung, für jedermann verständlich, der nur wenig Ahnung hat.
    Großes Dankeschön, habe vorher schon 5 oder 6 andere Beschreibungen ohne Erfolg gelesen.

Schreibe einen Kommentar