mod_log_sqlを使って、Apacheのアクセスログをmysqlに保存する設定をしたときのメモです。 アクセスログを保存するmysqlのストレージエンジンには、前からずっと気になっていたARCHIVEストレージエンジンを使用しました。 ■ ARCHIVEストレージエンジンについて
- ロギングや監査用途に向いている。SELECT、INSERT命令しか使えない
- INSERTのパフォーマンスはMyISAMの1.5倍、InnoDBの3.5倍
- データは圧縮して格納(圧縮率70~80%)
- インデックスは非対応
- 一般ユーザーの利用率は5%程度
すべて以前行ったセミナーでもらった資料より抜粋です。 ■ ログを保存するデータベースを作成 mysqlのインストールは完了しているものとして割愛します。 ただmysqlをソースからビルドしてインストールする場合には、configure時に–with-archive-storage-engineオプションを追加しないとARCHIVEストレージエンジンは使用できません。 現在のMySQLでARCHIVEストレージエンジンが有効かどうかを調べるには以下のようにします。``` mysql> show variables like ‘have_archive’; +—————+——-+ | Variable_name | Value | +—————+——-+ | have_archive | YES | +—————+——-+ 1 row in set (0.00 sec)
結果にYESと出ればARCHIVEストレージエンジンを使用できます。 もしNOと出た場合には、--with-archive-storage-engineオプションをつけて再度mysqlをビルドする必要があります。 続いてログ保存用のデータベースを、apachelogsという名前で、ストレージエンジンをARCHIVEで作成します。 /etc/my.cnfに以下のように設定してデフォルトのストレージエンジンをARCHIVEにします。設定後にmysqlを再起動します。
[mysqld]
default-storage-engine=archive
ストレージエンジンの設定方法は他にも色々あります(テーブル作成時に設定とか、alter tableとか)が、ここでは割愛します。 続けてログを保存するデータベースの設定をします。
mysql> create database apachelogs;
Query OK, 1 row affected (0.00 sec)
mysql> use apachelogs; Database changed
mysql> grant INSERT, CREATE ON apachelogs.* TO loguser@localhost IDENTIFIED BY ‘passwd’; Query OK, 0 rows affected (0.00 sec)
データベースの作成と同時に、apachelogsのデータベースについて、INSERT文とCREATE文の権限をもったloguserを登録しています(パスワードはpasswd)。 **■ mod\_log\_sqlのインストール** [mod\_log\_sql](http://www.outoforder.cc/projects/apache/mod_log_sql/)のページから最新版をダウンロードします(今回はVersion 1.101)。
$ wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.101.tar.bz2
$ tar jxvf mod_log_sql-1.101.tar.bz2
$ cd mod_log_sql-1.101
$ ./configure –with-apxs=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql
$ make
$ su
目次
make install
apxsとmysqlのパスはお使いの環境に合わせてください。 これで、/usr/local/apache2/module ディレクトリにmod\_log\_sql.so、mod\_log\_sql\_logio.so、mod\_log\_sql\_mysql.so、mod\_log\_sql\_ssl.soの4つのモジュールができていると思います。 今回はconfigure時にlibmysqlclientがないといったエラーが出たため、最初mod\_log\_sql\_mysqlが作成されませんでした。これについては、MySQLのマニュアルを頼りに、以下のようにしたら解決できました。
$ cp /usr/local/mysql/lib/libmysqlclient.so /usr/lib
$ su
/sbin/ldconfig -v | grep mysql
/usr/local/mysql/lib: libmysqlclient.so.15 -> libmysqlclient.so (changed)
**■ Apacheの設定をする** httpd.confを編集します。まずはロードモジュールの設定です
LoadModule log_sql_module modules/mod_log_sql.so
LoadModule log_sql_mysql_module modules/mod_log_sql_mysql.so
LoadModule log_sql_ssl_module modules/mod_log_sql_ssl.so
LogSQLLoginInfo mysql://loguser:passwd@localhost/apachelogs LogSQLCreateTables on LogSQLTransferLogTable access_log LogSQLDBParam port 3306 LogSQLDBParam socketfile /tmp/mysql.sock
LogSQLDBParam socketfile のパスはお使いの環境に合わせてください。 設定が終わったらapacheを再起動します。
$ /usr/local/apache2/bin/apachectl configtest
Syntax OK
$ /usr/local/apache2/bin/apachectl restart
以上で設定が全て完了しました。 webページにアクセスしてからapachelogsデータベースののaccess\_logテーブルを表示した結果です
select * from access_log\G
*************************** 1. row *************************** id: NULL agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 bytes_sent: 3442 child_pid: NULL cookie: NULL machine_id: NULL request_file: NULL referer: … remote_host: ***.***.***.*** remote_logname: NULL remote_user: - request_duration: 0 request_line: NULL request_method: GET request_protocol: HTTP/1.1 request_time: NULL request_uri: /images/logo.gif request_args: NULL server_port: NULL ssl_cipher: NULL ssl_keysize: NULL ssl_maxkeysize: NULL status: 200 time_stamp: 1227704007 virtual_host: NULL bytes_in: NULL bytes_out: NULL
…