Apache2:使用mod_log_sql(Debian Etch)记录到MySQL数据库

Apache2:使用mod_log_sql(Debian Etch)记录到MySQL数据库

版本1.0
作者:Falko Timme

本指南介绍如何将Apache2访问日志写入MySQL数据库而不是文件。 要实现这一点,我使用Apache2模块mod_log_sql。 我在本教程中使用Debian Etch服务器。

我不会保证这将为您工作!

1安装Apache2,MySQL,mod_log_sql

不幸的是, libapache2-mod-log-sql-mysql可用作Debian软件包,仅适用于Debian Lenny(测试)和Sid(unstable),但不适用于Etch。 因此我们将从Lenny安装libapache2-mod-log-sql-mysql包。 为此,打开/etc/apt/sources.list并添加行deb http://ftp2.de.debian.org/debian/ lenny main ; 您的/etc/apt/sources.list可能看起来像这样:

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

当然(为了不弄乱我们的系统),如果Etch没有适当的软件包,我们希望从Lenny安装软件包 - 如果有Etch和Lenny的软件包,我们要安装Etch软件包。 为了做到这一点,我们在Etch中给/ etc / apt / preferences中优先级较高的软件包:

vi /etc/apt/preferences
Package: *
Pin: release a=etch
Pin-Priority: 700

Package: *
Pin: release a=lenny
Pin-Priority: 650

(术语etchlenny参考/etc/apt/sources.list中的适当术语;如果您在那里使用稳定测试 ,则必须在/ etc / apt / preferences中使用稳定测试,而不是使用etchlenny好。)

之后,我们更新我们的包数据库:

apt-get update

如果您收到以下错误:

Segmentation faultsts... 96%

或这一个:

E: Dynamic MMap ran out of room

打开/etc/apt/apt.conf并为APT :: Cache-Limit添加一行非常高的值,例如:

vi /etc/apt/apt.conf
APT::Cache-Limit "100000000";

然后跑

apt-get update

再次升级安装的软件包:

apt-get upgrade

(如果您看到任何问题,您可以接受默认值。)

要安装Apache2,MySQL和mod_log_sql,我们运行:

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

为MySQL用户root创建密码(将yourrootsql密码替换为您要使用的密码):

mysqladmin -u root password yourrootsqlpassword

然后检查

netstat -tap | grep mysql

MySQL正在监听哪个地址。 如果输出如下所示:

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

这意味着MySQL只监听localhost.localdomain ,那么你以前设置的密码是安全的。 但如果输出如下所示:

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

您也应该为您的主机名设置一个MySQL密码,因为否则任何人都可以访问您的数据库并修改数据:

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

mod_log_sql在安装时自动启用,但是还有另一个模块,我们应该启用:mod_uique_id(没有必要,但是没有它,mod_log_sql将把访问日志的MySQL表中的id列留空)。 id列将包含由标准Apache模块mod_unique_id提供的唯一请求ID。

a2enmod unique_id

重新加载Apache:

/etc/init.d/apache2 force-reload

2创建虚拟主机

现在我将在目录/ var / www / web1 / web中创建一个默认的Apache vhost。 为此,我将修改/ etc / apache2 / sites-available / default中的默认Apache vhost 配置 。 如果您已经拥有要启用MySQL日志记录的vhost,则必须根据您的情况调整本教程。

首先,我们创建目录/ var / www / web1 / web ,并使Apache用户( www-data )成为该目录的所有者:

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

然后我们备份默认的Apache vhost配置( / etc / apache2 / sites-available / default )并创建我们自己的配置:

mv /etc/apache2/sites-available/default /etc/apache2/sites-available/default_orig
vi /etc/apache2/sites-available/default
NameVirtualHost *
<VirtualHost *>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/web1/web/
        <Directory /var/www/web1/web/>
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>

然后重新加载Apache:

/etc/init.d/apache2 reload

3配置虚拟主机进行MySQL日志记录

您可以在HTML文件/usr/share/doc/libapache2-mod-log-sql/manual.html中找到mod_log_sql的文档 。 您应该将其复制到工作站(例如使用WinSCP )并学习。

读取这个文件后,我们创建一个名为apachelogs的MySQL数据库,它将包含我们访问日志的表(它可以包含多个访问日志表,例如每个虚拟主机一个)。 除此之外,我们还创建了MySQL用户loguser - 此用户将被mod_log_sql用于稍后连接到MySQL。 loguser将具有CREATEINSERT权限,以便它可以自动为访问日志创建表(如果表不存在)并在这些表中插入记录:

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 loguser@localhost.localdomain identified by 'loguser_password';
FLUSH PRIVILEGES;

(用您选择的密码替换loguser_password 。)

然后我们离开MySQL shell:

quit;

现在我们在/ etc / apache2 / sites-available / default中修改vhost,看起来如下:

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 *
<VirtualHost *>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/web1/web/
        <Directory /var/www/web1/web/>
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        LogSQLTransferLogTable web1_access_log
</VirtualHost>

LogSQLLoginInfo (将数据库的登录凭据保存), LogSQLCreateTables (它告诉mod_log_sql创建表,如果它们不存在), LogSQLDBParam socketfile (它指定了MySQL套接字)和LogSQLTransferLogFormat (它指定了什么被登录到数据库中) )指令进入全局Apache配置。 LogSQLTransferLogTable指令进入vhost配置 - 这样可以为每个虚拟主机指定不同的访问日志表(例如web1_access_logweb2_access_logweb3_access_log等)。

LogSQLTransferLogFormat指令在/usr/share/doc/libapache2-mod-log-sql/manual.html文件中有更详细的解释

之后重新加载Apache:

/etc/init.d/apache2 reload

4测试mod_log_sql

现在,您可以在浏览器中从vhost访问一些页面,然后检查apachelogs数据库:

mysql -u root -p
use apachelogs;
show tables;

您现在应该看到, web1_access_log已由mod_log_sql创建:

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

mysql>

现在我们检查一下表中的内容:

select * from web1_access_log;

如果一切顺利,您应该在该表中找到访问日志:

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>

类型

quit;

离开MySQL shell。

5链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏