Apache Webserver Logs in MySQL Datenbank schreiben

veröffentlicht am 28. Juni 2010

Eben habe ich mir die Frage gestellt, ob man Apache Logdateien nicht irgendwie in eine MySQL-Datenbank verlagern kann. Das Problem ist nämlich folgendes: zieht man den Webserver von einer Maschine auf eine andere, muss man unbedingt drauf achten, auch die Logfiles schnellstmöglich zu kopieren und einzurichten, damit einem keine statistischen Daten entgehen. Zwar kann man solche Probleme mit Netzwerkdateisystemen umgehen, so ein Aufbau stellt bei Privatpersonen allerdings eher die Ausnahme dar. Nach kurzer Suche wurde ich schnell nach dem Apache-Modul mod_log_sql fündig.

In dieser Anleitung beschreibe ich, wie ich das Modul auf meinem vServer installiert und eingerichtet habe. Durch das Logging in einer MySQL-Datenbank ergeben sich ganz neue Möglichkeiten. Man kann so zum Beispiel relativ einfach Programme zum Auswerten von Besucherdaten schreiben. Auch könnten Eindringungsversuche relativ schnell und einfach erkannt werden, wenn man sich ein passendes Script schreibt. Sollten Webserver und Datenbankserver auf unterschiedlichen Computern liegen, muss bei einem Umzug auch nicht an die Log-Dateien gedacht werden.

Installation

Auf meinem vServer läuft Ubuntu 9.04. Dort kann das Modul ganz bequem aus den Paketquellen installiert werden:

aptitude install libapache2-mod-log-sql-mysql

MySQL-Datenbank einrichten

Jetzt sollte erst einmal eine Datenbank für die Logs eingerichtet werden. Ich benutze hierfür immer PHPMyAdmin, natürlich kann man aber auch andere Administrations-Werkzeuge benutzen. Hartgesottene erstellen die Datenbank zum Beispiel über die Shell :D

Ich empfehle, der Datenbank einen eigenen Benutzer und ein sicheres Passwort zu vergeben. In dieser Anleitung verwende ich den Datenbank-Namen apachelogs.

Wie es aussieht, befindet sich in diversen Distributionen ein fehlerhaftes SQL-Script, wodurch die scoreboard-Tabelle nicht angelegt werden kann. In dieser Tabelle werden Traffic, Statuscodes etc des Servers protokolliert. Damit die ErrorLogs später nicht vollgeschrieben werden, sollte die Tabelle kurz per Hand mit folgendem SQL-Script angelegt werden:

CREATE TABLE IF NOT EXISTS `scoreboard` (
`id` int(14) NOT NULL auto_increment,
`vhost` varchar(50) NOT NULL default '',
`bytes_sent` int(14) NOT NULL default '0',
`count_hosts` int(12) NOT NULL default '0',
`count_visits` int(12) NOT NULL default '0',
`count_status_200` int(12) NOT NULL default '0',
`count_status_404` int(12) NOT NULL default '0',
`count_impressions` int(18) NOT NULL default '0',
`last_run` int(14) NOT NULL default '0',
`month` int(4) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`domain` varchar(50) NOT NULL default '',
`bytes_receive` int(14) NOT NULL default '0',
PRIMARY KEY  (`id`),
UNIQUE KEY `vhost` (`vhost`,`month`,`year`,`domain`)
) TYPE=MyISAM;

[via Sebastian]

Globale Serverkonfiguration

Nun muss das Modul für das Logging natürlich eingerichtet werden. Öffne dazu die Datei /etc/apache2/apache2.conf mit einem Texteditor:

nano /etc/apache2/apache2.conf

Dort fügst du folgende Zeilen hinzu

# MySQL-Parameter anpassen
LogSQLLoginInfo mysql://<MySQ-Benutzer>:<MySQL-Passwort>@<MySQL-Server>/apachelogs

# Nur angeben, wenn der DB-Server auf demselben Computer wie der Webserver läuft
LogSQLDBParam socketfile /var/run/mysqld/mysqld.sock

# Falls nötig, kann hier ein vom Standard abweichender MySQL-Port angegeben werden
LogSQLDBParam port <Port>

# Erstellt automatisch Tabellen für das Logging
LogSQLCreateTables on

# Tabellen müssen nicht für jeden vhost angegeben werden
# Tabellennamen werden über den ServerName generiert
LogSQLMassVirtualHosting On

Um das Standard-Logging vom Apache Webserver zu deaktivieren, kommentierst du außerdem die CustomLog-Zeile aus

# CustomLog [...]

vhost-Einträge anpassen

Danach müssen die einzelnen vhost-Einträge noch angepasst werden. Die Konfigurationsdateien für aktivierte vhosts liegen unter /etc/apache2/sites-enabled/. Die einzelnen Konfigurationsdateien werden mit einem Texteditor bearbeitet. Im Grunde genommen muss nur der AccessLog-Eintrag auskommentiert werden:

<VirtualHost *:80>
   ServerName www.patrick-gotthard.de
   DocumentRoot /var/www/wordpress
   ErrorLog /var/log/apache2/wordpress-error.log
   #AccessLog /var/log/pache2/wordpress-access.log
</VirtualHost>

Wer lieber selber Tabellen-Namen für das Logging festlegen möchte, muss bei jedem vhost den folgenden Eintrag ergänzen:

LogSQLTransferLogTable <Tabellenname>

In dem Fall muss oben in der Server-Konfiguration der LogSQLMassVirtualHosting-Eintrag entfernt werden. Das ErrorLog muss aus dem Grund noch angeben werden, da das Modul das Fehler-Logging nicht übernimmt.

Log-Format einrichten

Wenn wir weder in der Server-Konfiguration noch in der vhosts-Konfiguration eine Angabe über das Log-Format machen, werden alle Daten wie in der Apache combined-Einstellung und ein paar Extras mitgeloggt. Möchte man das Logging genauer einstellen, sollte man sich die Einstellungsmöglichkeiten der mitzuloggenden Daten anschauen.

Einspielen von „verpassten“ SQL-Queries

Sollte der MySQL-Server einmal nicht erreichbar sein, werden in der Datei /tmp/preserve SQL-Befehle abgelegt. Diese kann man bequem per Konsole einspielen, wenn der MySQL-Server wieder erreichbar ist. So gehen keine statistischen Daten verloren.

mysql -u<MySQL-Benutzer> -p <Datenbank> < /tmp/preserve

Testen

Nachdem du alle Konfigurationen getätigt hast, musst du den Apache-Server einmal neustarten:

/etc/init.d/apache2 restart

Um zu prüfen, ob das Logging ordentlich funktioniert, öffnest du eine der auf dem Webserver gehosteten Webseiten. Danach schaust du mit einem Tool deiner Wahl in die entsprechenden MySQL-Tabellen. Wenn dort Einträge vorhanden sind, sollte alles ordentlich funktionieren.

Weiterführende Quelle

Wer sich intensiver mit dem Modul auseinander setzen möchte, sollte sich die offizielle mod_log_sql-Dokumentation anschauen. Die Dokumentation ist wirklich kurz und präzise gehalten, ich kann jedem nur empfehlen, sich die Dokumentation einmal komplett durchzulesen.

Hinterlasse einen Kommentar