Apache MySQL · 5 min read · Feb 03, 2026

Apache2 : Journalisation dans une base de données MySQL avec mod_log_sql (Debian Etch)

Apache2 : Journalisation dans une base de données MySQL avec mod_log_sql (Debian Etch)

Version 1.0
Auteur : Falko Timme

Ce guide montre comment vous pouvez écrire le journal d’accès Apache2 dans une base de données MySQL au lieu d’un fichier. Pour ce faire, j’utilise le module Apache2 mod_log_sql. J’utilise un serveur Debian Etch dans ce tutoriel.

Je ne donne aucune garantie que cela fonctionnera pour vous !

1 Installation d’Apache2, MySQL, mod_log_sql

Malheureusement, libapache2-mod-log-sql-mysql n’est disponible en tant que paquet Debian que pour Debian Lenny (testing) et Sid (unstable), mais pas pour Etch. Par conséquent, nous allons installer le paquet libapache2-mod-log-sql-mysql de Lenny. Pour ce faire, ouvrez /etc/apt/sources.list et ajoutez la ligne deb http://ftp2.de.debian.org/debian/ lenny main ; votre /etc/apt/sources.list pourrait alors ressembler à ceci :

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 |

Bien sûr (afin de ne pas perturber notre système), nous voulons installer des paquets de Lenny uniquement s’il n’y a pas de paquet approprié d’Etch - s’il y a des paquets d’Etch et de Lenny, nous voulons installer celui d’Etch. Pour ce faire, nous donnons aux paquets d’Etch une priorité plus élevée dans /etc/apt/preferences :

vi /etc/apt/preferences

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

(Les termes etch et lenny font référence aux termes appropriés dans /etc/apt/sources.list ; si vous utilisez stable et testing là-bas, vous devez également utiliser stable et testing au lieu d’etch et lenny dans /etc/apt/preferences.)

Ensuite, nous mettons à jour notre base de données de paquets :

apt-get update

Si vous obtenez une erreur comme celle-ci :

Segmentation faultsts... 96%

ou celle-ci :

E: Dynamic MMap ran out of room

ouvrez /etc/apt/apt.conf et ajoutez une ligne pour APT::Cache-Limit avec une valeur très élevée, par exemple comme ceci :

vi /etc/apt/apt.conf 

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

Ensuite, exécutez

apt-get update

à nouveau et mettez à niveau les paquets installés :

apt-get upgrade 

(Si vous voyez des questions, vous pouvez accepter les valeurs par défaut.)

Pour installer Apache2, MySQL et mod_log_sql, nous exécutons :

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

Créez un mot de passe pour l’utilisateur MySQL root (remplacez yourrootsqlpassword par le mot de passe que vous souhaitez utiliser) :

mysqladmin -u root password yourrootsqlpassword

Puis vérifiez avec

netstat -tap | grep mysql

sur quelles adresses MySQL écoute. Si la sortie ressemble à ceci :

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

ce qui signifie que MySQL écoute uniquement sur localhost.localdomain, alors vous êtes en sécurité avec le mot de passe que vous avez défini auparavant. Mais si la sortie ressemble à ceci :

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

vous devriez définir un mot de passe MySQL pour votre nom d’hôte également, car sinon n’importe qui peut accéder à votre base de données et modifier des données :

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

mod_log_sql a été activé automatiquement lorsque nous l’avons installé, mais il y a un autre module que nous devrions activer : mod_uique_id (ce n’est pas nécessaire, mais sans lui, mod_log_sql laissera la colonne id dans la table MySQL pour le journal d’accès vide). La colonne id contiendra l’ID de requête unique fourni par le module Apache standard mod_unique_id.

a2enmod unique_id

Rechargez Apache :

/etc/init.d/apache2 force-reload

2 Création d’un hôte virtuel

Je vais maintenant créer un hôte virtuel Apache par défaut dans le répertoire /var/www/web1/web. À cette fin, je vais modifier la configuration par défaut de l’hôte virtuel Apache dans /etc/apache2/sites-available/default. Si vous avez déjà un hôte virtuel pour lequel vous souhaitez activer la journalisation MySQL, vous devez adapter ce tutoriel à votre situation.

Tout d’abord, nous créons le répertoire /var/www/web1/web et faisons de l’utilisateur Apache (www-data) le propriétaire de ce répertoire :

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

Ensuite, nous sauvegardons la configuration par défaut de l’hôte virtuel Apache (/etc/apache2/sites-available/default) et créons la nôtre :

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 |

Ensuite, rechargez Apache :

/etc/init.d/apache2 reload

3 Configurer l’hôte virtuel pour la journalisation MySQL

Vous pouvez trouver la documentation pour mod_log_sql dans le fichier HTML /usr/share/doc/libapache2-mod-log-sql/manual.html. Vous devriez le copier sur votre station de travail (par exemple avec WinSCP) et l’étudier.

Après avoir lu ce fichier, nous créons une base de données MySQL appelée apachelogs qui contiendra les tables pour nos journaux d’accès (elle peut contenir plusieurs tables de journaux d’accès, par exemple une pour chaque hôte virtuel que vous avez). En plus de cela, nous créons l’utilisateur MySQL loguser - cet utilisateur sera utilisé par mod_log_sql pour se connecter à MySQL plus tard. loguser aura des privilèges CREATE et INSERT afin qu’il puisse automatiquement créer des tables pour les journaux d’accès (si les tables n’existent pas déjà) et insérer des enregistrements dans ces tables :

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;

(Remplacez loguser_password par un mot de passe de votre choix.)

Ensuite, nous quittons le shell MySQL :

quit;

Maintenant, nous modifions notre hôte virtuel dans /etc/apache2/sites-available/default pour qu’il ressemble à ceci :

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 |

Les directives LogSQLLoginInfo (qui contient les identifiants de connexion à la base de données), LogSQLCreateTables (qui indique à mod_log_sql de créer des tables si elles n’existent pas), LogSQLDBParam socketfile (qui spécifie le socket MySQL), et LogSQLTransferLogFormat (qui spécifie ce qui est enregistré dans la base de données) vont dans la configuration Apache globale. La directive LogSQLTransferLogTable va dans la configuration de l’hôte virtuel - de cette façon, vous pouvez spécifier différentes tables de journaux d’accès pour chaque hôte virtuel (par exemple, web1_access_log, web2_access_log, web3_access_log, etc.).

La directive LogSQLTransferLogFormat est expliquée plus en détail dans le fichier /usr/share/doc/libapache2-mod-log-sql/manual.html.

Rechargez Apache ensuite :

/etc/init.d/apache2 reload

4 Tester mod_log_sql

Maintenant, accédez à certaines pages de votre hôte virtuel dans un navigateur et vérifiez ensuite la base de données apachelogs :

mysql -u root -p

use apachelogs;
show tables;

Vous devriez maintenant voir que la table web1_access_log a été créée par mod_log_sql :

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

mysql>

Maintenant, vérifions ce qu’il y a dans cette table :

select * from web1_access_log;

Si tout s’est bien passé, vous devriez trouver des journaux d’accès dans cette table :

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>

Tapez

quit;

pour quitter le shell MySQL.

5 Liens

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.