Apache MySQL · 5 min read · Feb 03, 2026
Apache2: Registro en una base de datos MySQL con mod_log_sql (Debian Etch)
Apache2: Registro en una base de datos MySQL con mod_log_sql (Debian Etch)
Versión 1.0
Autor: Falko Timme
Esta guía muestra cómo puedes escribir el registro de acceso de Apache2 en una base de datos MySQL en lugar de un archivo. Para lograr esto, utilizo el módulo de Apache2 mod_log_sql. Estoy usando un servidor Debian Etch en este tutorial.
¡No emito ninguna garantía de que esto funcione para ti!
1 Instalando Apache2, MySQL, mod_log_sql
Desafortunadamente, libapache2-mod-log-sql-mysql está disponible como un paquete de Debian solo para Debian Lenny (testing) y Sid (inestable), pero no para Etch. Por lo tanto, instalaremos el paquete libapache2-mod-log-sql-mysql de Lenny. Para hacer esto, abre /etc/apt/sources.list y agrega la línea deb http://ftp2.de.debian.org/debian/ lenny main; tu /etc/apt/sources.list podría verse así:
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 |
Por supuesto (para no desordenar nuestro sistema), queremos instalar paquetes de Lenny solo si no hay un paquete apropiado de Etch; si hay paquetes de Etch y Lenny, queremos instalar el de Etch. Para hacer esto, damos a los paquetes de Etch una mayor prioridad en /etc/apt/preferences:
vi /etc/apt/preferences| Package: * Pin: release a=etch Pin-Priority: 700 Package: * Pin: release a=lenny Pin-Priority: 650 |
(Los términos etch y lenny se refieren a los términos apropiados en /etc/apt/sources.list; si estás usando stable y testing allí, debes usar stable y testing en lugar de etch y lenny en /etc/apt/preferences también.)
Después, actualizamos nuestra base de datos de paquetes:
apt-get updateSi obtienes un error como este:
Segmentation faultsts... 96%o este:
E: Dynamic MMap ran out of roomabre /etc/apt/apt.conf y agrega una línea para APT::Cache-Limit con un valor muy alto, por ejemplo así:
vi /etc/apt/apt.conf | APT::Cache-Limit "100000000"; |
Luego ejecuta
apt-get updatenuevamente y actualiza los paquetes instalados:
apt-get upgrade (Si ves alguna pregunta, puedes aceptar los valores predeterminados.)
Para instalar Apache2, MySQL y mod_log_sql, ejecutamos:
apt-get install apache2 mysql-server mysql-client libapache2-mod-log-sql-mysqlCrea una contraseña para el usuario root de MySQL (reemplaza yourrootsqlpassword con la contraseña que deseas usar):
mysqladmin -u root password yourrootsqlpasswordLuego verifica con
netstat -tap | grep mysqlen qué direcciones está escuchando MySQL. Si la salida se ve así:
tcp 0 0 localhost.localdo:mysql *:* LISTEN 2713/mysqldlo que significa que MySQL está escuchando solo en localhost.localdomain, entonces estás seguro con la contraseña que configuraste antes. Pero si la salida se ve así:
tcp 0 0 *:mysql *:* LISTEN 2713/mysqlddebes establecer una contraseña de MySQL para tu nombre de host también, porque de lo contrario cualquiera puede acceder a tu base de datos y modificar datos:
mysqladmin -h server1.example.com -u root password yourrootsqlpasswordmod_log_sql se habilitó automáticamente cuando lo instalamos, pero hay otro módulo que debemos habilitar: mod_uique_id (no es necesario, pero sin él, mod_log_sql dejará la columna id en la tabla MySQL para el registro de acceso vacía). La columna id contendrá el ID de solicitud único proporcionado por el módulo estándar de Apache mod_unique_id.
a2enmod unique_idRecarga Apache:
/etc/init.d/apache2 force-reload2 Creando un Host Virtual
Ahora crearé un vhost de Apache predeterminado en el directorio /var/www/web1/web. Para este propósito, modificaré la configuración del vhost predeterminado de Apache en /etc/apache2/sites-available/default. Si ya tienes un vhost para el cual te gustaría habilitar el registro de MySQL, debes ajustar este tutorial a tu situación.
Primero, creamos el directorio /var/www/web1/web y hacemos que el usuario de Apache (www-data) sea el propietario de ese directorio:
mkdir -p /var/www/web1/web
chown www-data /var/www/web1/web
Luego hacemos una copia de seguridad de la configuración del vhost predeterminado de Apache (/etc/apache2/sites-available/default) y creamos el nuestro:
mv /etc/apache2/sites-available/default /etc/apache2/sites-available/default_orig
vi /etc/apache2/sites-available/default
| NameVirtualHost * |
Luego recarga Apache:
/etc/init.d/apache2 reload3 Configurar el Host Virtual para el Registro de MySQL
Puedes encontrar la documentación para mod_log_sql en el archivo HTML /usr/share/doc/libapache2-mod-log-sql/manual.html. Deberías copiarlo a tu estación de trabajo (por ejemplo, con WinSCP) y estudiarlo.
Habiendo leído este archivo, creamos una base de datos MySQL llamada apachelogs que contendrá las tablas para nuestros registros de acceso (puede contener múltiples tablas de registro de acceso, por ejemplo, una para cada host virtual que tengas). Además de eso, creamos el usuario de MySQL loguser - este usuario será utilizado por mod_log_sql para conectarse a MySQL más adelante. loguser tendrá privilegios de CREATE e INSERT para que pueda crear automáticamente tablas para los registros de acceso (si las tablas no existen ya) e insertar registros en estas tablas:
mysql -u root -pcreate 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;
(Reemplaza loguser_password con una contraseña de tu elección.)
Luego salimos de la consola de MySQL:
quit;Ahora modificamos nuestro vhost en /etc/apache2/sites-available/default para que se vea como sigue:
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 * |
Las directivas LogSQLLoginInfo (que contiene las credenciales de inicio de sesión a la base de datos), LogSQLCreateTables (que le dice a mod_log_sql que cree tablas si no existen), LogSQLDBParam socketfile (que especifica el socket de MySQL), y LogSQLTransferLogFormat (que especifica qué se registra en la base de datos) van en la configuración global de Apache. La directiva LogSQLTransferLogTable va en la configuración del vhost; de esa manera puedes especificar diferentes tablas de registro de acceso para cada host virtual (por ejemplo, web1_access_log, web2_access_log, web3_access_log, etc.).
La directiva LogSQLTransferLogFormat se explica con más detalle en el archivo /usr/share/doc/libapache2-mod-log-sql/manual.html.
Recarga Apache después:
/etc/init.d/apache2 reload4 Probando mod_log_sql
Ahora accede a algunas páginas de tu vhost en un navegador y verifica la base de datos apachelogs después:
mysql -u root -puse apachelogs;
show tables;
Ahora deberías ver que la tabla web1_access_log ha sido creada por mod_log_sql:
mysql> show tables;
+———————-+
| Tables_in_apachelogs |
+———————-+
| web1_access_log |
+———————-+
1 row in set (0.00 sec)
mysql>
Ahora verifiquemos qué hay en esa tabla:
select * from web1_access_log;Si todo salió bien, deberías encontrar registros de acceso en esa tabla:
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>
Escribe
quit;para salir de la consola de MySQL.
5 Enlaces
- Apache: http://httpd.apache.org
- Debian: http://www.debian.org
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.