Apache, MySQL · 5 min read · Feb 03, 2026

Apache2: Protokollierung in eine MySQL-Datenbank mit mod_log_sql (Debian Etch)

Apache2: Protokollierung in eine MySQL-Datenbank mit mod_log_sql (Debian Etch)

Version 1.0
Autor: Falko Timme

Dieses Handbuch zeigt, wie Sie das Apache2-Zugriffsprotokoll in eine MySQL-Datenbank anstelle einer Datei schreiben können. Um dies zu erreichen, verwende ich das Apache2-Modul mod_log_sql. Ich benutze einen Debian Etch-Server in diesem Tutorial.

Ich gebe keine Garantie, dass dies bei Ihnen funktioniert!

1 Installation von Apache2, MySQL, mod_log_sql

Leider ist libapache2-mod-log-sql-mysql nur als Debian-Paket für Debian Lenny (Testing) und Sid (unstable) verfügbar, nicht jedoch für Etch. Daher werden wir das Paket libapache2-mod-log-sql-mysql aus Lenny installieren. Öffnen Sie dazu /etc/apt/sources.list und fügen Sie die Zeile deb http://ftp2.de.debian.org/debian/ lenny main hinzu; Ihre /etc/apt/sources.list könnte dann so aussehen:

vi /etc/apt/sources.list

| deb http://ftp2.de.debian.org/debian/ etch main deb-src http://ftp2.de.debian.org/debian/ etch main deb http://ftp2.de.debian.org/debian/ lenny main deb http://security.debian.org/ etch/updates main contrib deb-src http://security.debian.org/ etch/updates main contrib |

Natürlich (um unser System nicht durcheinander zu bringen) möchten wir Pakete aus Lenny nur installieren, wenn es kein passendes Paket aus Etch gibt - wenn es Pakete aus Etch und Lenny gibt, möchten wir das aus Etch installieren. Dazu geben wir den Paketen aus Etch eine höhere Priorität in /etc/apt/preferences:

vi /etc/apt/preferences

| Package: * Pin: release a=etch Pin-Priority: 700 Package: * Pin: release a=lenny Pin-Priority: 650 |

(Die Begriffe etch und lenny beziehen sich auf die entsprechenden Begriffe in /etc/apt/sources.list; wenn Sie dort stable und testing verwenden, müssen Sie auch stable und testing anstelle von etch und lenny in /etc/apt/preferences verwenden.)

Anschließend aktualisieren wir unsere Paketdatenbank:

apt-get update

Wenn Sie einen Fehler wie diesen erhalten:

Segmentation faultsts... 96%

oder diesen:

E: Dynamic MMap ran out of room

öffnen Sie /etc/apt/apt.conf und fügen Sie eine Zeile für APT::Cache-Limit mit einem sehr hohen Wert hinzu, z.B. so:

vi /etc/apt/apt.conf 

| APT::Cache-Limit "100000000"; |

Führen Sie dann

apt-get update

nochmals aus und aktualisieren Sie die installierten Pakete:

apt-get upgrade 

(Wenn Sie Fragen sehen, können Sie die Standardwerte akzeptieren.)

Um Apache2, MySQL und mod_log_sql zu installieren, führen wir aus:

apt-get install apache2 mysql-server mysql-client libapache2-mod-log-sql-mysql

Erstellen Sie ein Passwort für den MySQL-Benutzer root (ersetzen Sie yourrootsqlpassword durch das Passwort, das Sie verwenden möchten):

mysqladmin -u root password yourrootsqlpassword

Überprüfen Sie dann mit

netstat -tap | grep mysql

auf welchen Adressen MySQL lauscht. Wenn die Ausgabe so aussieht:

tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     2713/mysqld

was bedeutet, dass MySQL nur auf localhost.localdomain lauscht, dann sind Sie mit dem Passwort, das Sie zuvor festgelegt haben, auf der sicheren Seite. Wenn die Ausgabe jedoch so aussieht:

tcp        0      0 *:mysql *:*                     LISTEN     2713/mysqld

sollten Sie auch ein MySQL-Passwort für Ihren Hostnamen festlegen, da sonst jeder auf Ihre Datenbank zugreifen und Daten ändern kann:

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

mod_log_sql wurde automatisch aktiviert, als wir es installiert haben, aber es gibt ein weiteres Modul, das wir aktivieren sollten: mod_uique_id (es ist nicht notwendig, aber ohne es lässt mod_log_sql die id-Spalte in der MySQL-Tabelle für das Zugriffsprotokoll leer). Die id-Spalte enthält die eindeutige Anforderungs-ID, die vom Standard-Apache-Modul mod_unique_id bereitgestellt wird.

a2enmod unique_id

Laden Sie Apache neu:

/etc/init.d/apache2 force-reload

2 Erstellen eines virtuellen Hosts

Ich werde jetzt einen Standard-Apache-vhost im Verzeichnis /var/www/web1/web erstellen. Zu diesem Zweck werde ich die Standard-Apache-vhost-Konfiguration in /etc/apache2/sites-available/default ändern. Wenn Sie bereits einen vhost haben, für den Sie die MySQL-Protokollierung aktivieren möchten, müssen Sie dieses Tutorial an Ihre Situation anpassen.

Zuerst erstellen wir das Verzeichnis /var/www/web1/web und machen den Apache-Benutzer (www-data) zum Eigentümer dieses Verzeichnisses:

mkdir -p /var/www/web1/web
chown www-data /var/www/web1/web

Dann sichern wir die Standard-Apache-vhost-Konfiguration (/etc/apache2/sites-available/default) und erstellen unsere eigene:

mv /etc/apache2/sites-available/default /etc/apache2/sites-available/default_orig
vi /etc/apache2/sites-available/default

| NameVirtualHost * ServerAdmin webmaster@localhost DocumentRoot /var/www/web1/web/ Options Indexes MultiViews AllowOverride None Order allow,deny allow from all |

Dann laden Sie Apache neu:

/etc/init.d/apache2 reload

3 Konfigurieren Sie den virtuellen Host für MySQL-Protokollierung

Die Dokumentation für mod_log_sql finden Sie in der HTML-Datei /usr/share/doc/libapache2-mod-log-sql/manual.html. Sie sollten sie auf Ihren Arbeitsplatz kopieren (z.B. mit WinSCP) und studieren.

Nachdem Sie diese Datei gelesen haben, erstellen wir eine MySQL-Datenbank namens apachelogs, die die Tabellen für unsere Zugriffsprotokolle enthalten wird (sie kann mehrere Tabellen für Zugriffsprotokolle enthalten, z.B. eine für jeden virtuellen Host, den Sie haben). Zusätzlich erstellen wir den MySQL-Benutzer loguser - dieser Benutzer wird später von mod_log_sql verwendet, um sich mit MySQL zu verbinden. loguser wird CREATE- und INSERT-Berechtigungen haben, damit er automatisch Tabellen für die Zugriffsprotokolle erstellen (wenn die Tabellen noch nicht existieren) und Datensätze in diese Tabellen einfügen kann:

mysql -u root -p
create database apachelogs;

grant insert,create on apachelogs. to loguser@localhost identified by ‘loguser_password’;
grant insert,create on apachelogs.
to [email protected] identified by ‘loguser_password’;
FLUSH PRIVILEGES;

(Ersetzen Sie loguser_password durch ein Passwort Ihrer Wahl.)

Dann verlassen wir die MySQL-Shell:

quit;

Jetzt ändern wir unseren vhost in /etc/apache2/sites-available/default, sodass er wie folgt aussieht:

vi /etc/apache2/sites-available/default

| LogSQLLoginInfo mysql://loguser:loguser_password@localhost/apachelogs LogSQLCreateTables on LogSQLDBParam socketfile /var/run/mysqld/mysqld.sock LogSQLTransferLogFormat AbHhmRSsTUuvI NameVirtualHost * ServerAdmin webmaster@localhost DocumentRoot /var/www/web1/web/ Options Indexes MultiViews AllowOverride None Order allow,deny allow from all LogSQLTransferLogTable web1_access_log |

Die Direktiven LogSQLLoginInfo (die die Anmeldeinformationen zur Datenbank enthält), LogSQLCreateTables (die mod_log_sql anweist, Tabellen zu erstellen, wenn sie nicht existieren), LogSQLDBParam socketfile (die den MySQL-Socket angibt) und LogSQLTransferLogFormat (die angibt, was in der Datenbank protokolliert wird) gehören zur globalen Apache-Konfiguration. Die Direktive LogSQLTransferLogTable gehört zur vhost-Konfiguration - so können Sie unterschiedliche Zugriffsprotokolltabellen für jeden virtuellen Host angeben (z.B. web1_access_log, web2_access_log, web3_access_log usw.).

Die Direktive LogSQLTransferLogFormat wird ausführlicher in der Datei /usr/share/doc/libapache2-mod-log-sql/manual.html erklärt.

Laden Sie danach Apache neu:

/etc/init.d/apache2 reload

4 Testen von mod_log_sql

Zugreifen auf einige Seiten von Ihrem vhost in einem Browser und überprüfen Sie anschließend die apachelogs-Datenbank:

mysql -u root -p

use apachelogs;
show tables;

Sie sollten jetzt sehen, dass die Tabelle web1_access_log von mod_log_sql erstellt wurde:

mysql> show tables;
+———————-+
| Tables_in_apachelogs |
+———————-+
| web1_access_log |
+———————-+
1 row in set (0.00 sec)

mysql>

Jetzt überprüfen wir, was in dieser Tabelle steht:

select * from web1_access_log;

Wenn alles gut gelaufen ist, sollten Sie Zugriffsprotokolle in dieser Tabelle finden:

mysql> select * from web1_access_log;
+———————+———————————————————————————————…
| id | agent …
+———————+———————————————————————————————…
| JpEF8MCoAGQAAFyuEBU | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14…
| JpPHIMCoAGQAAFyuEBY | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14…
| JpTj0MCoAGQAAFyuEBc | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14…
+———————+———————————————————————————————…
3 rows in set (0.00 sec)

mysql>

Geben Sie

quit;

ein, um die MySQL-Shell zu verlassen.

5 Links

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.