CentOS, apacheのアクセスログをMySQLで保存するmod_log_sql

apache2、mysqlはyumでインストール済みの前提で。

http://www.outoforder.cc/projects/apache/mod_log_sql/

ソースファイルをダウンロードして、インストールします。

# 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
# make
# make install

設定を追加します。

# vi /etc/httpd/conf.d/mod_log_sql.conf
LoadModule      log_sql_module          modules/mod_log_sql.so
LoadModule      log_sql_mysql_module    modules/mod_log_sql_mysql.so

VirtualHostに記述できるようです。

# vi /etc/httpd/vhost.conf


  # DBアクセス情報
  LogSQLLoginInfo mysql://ユーザ名:パスワード@localhost/apache2_log
  # テーブルをつくります
  LogSQLCreateTables on
  # MySQLのソケット指定
  LogSQLDBParam socketfile /var/lib/mysql/mysql.sock
  # 記録するテーブル名
  LogSQLTransferLogTable access_logs
  

アクセスログを記録するデータベースをつくります。

mysql> create database apache2_log default character set utf8;

ブラウザからアクセスしてデータベースを確認します。

mysql> select count(*) from access_logs;
mysql> desc access_logs;
+------------------+----------------------+------+-----+---------+-------+
| Field            | Type                 | Null | Key | Default | Extra |
+------------------+----------------------+------+-----+---------+-------+
| id               | char(19)             | YES  |     | NULL    |       | 
| agent            | varchar(255)         | YES  |     | NULL    |       | 
| bytes_sent       | int(10) unsigned     | YES  |     | NULL    |       | 
| child_pid        | smallint(5) unsigned | YES  |     | NULL    |       | 
| cookie           | varchar(255)         | YES  |     | NULL    |       | 
| machine_id       | varchar(25)          | YES  |     | NULL    |       | 
| request_file     | varchar(255)         | YES  |     | NULL    |       | 
| referer          | varchar(255)         | YES  |     | NULL    |       | 
| remote_host      | varchar(50)          | YES  |     | NULL    |       | 
| remote_logname   | varchar(50)          | YES  |     | NULL    |       | 
| remote_user      | varchar(50)          | YES  |     | NULL    |       | 
| request_duration | smallint(5) unsigned | YES  |     | NULL    |       | 
| request_line     | varchar(255)         | YES  |     | NULL    |       | 
| request_method   | varchar(10)          | YES  |     | NULL    |       | 
| request_protocol | varchar(10)          | YES  |     | NULL    |       | 
| request_time     | char(28)             | YES  |     | NULL    |       | 
| request_uri      | varchar(255)         | YES  |     | NULL    |       | 
| request_args     | varchar(255)         | YES  |     | NULL    |       | 
| server_port      | smallint(5) unsigned | YES  |     | NULL    |       | 
| ssl_cipher       | varchar(25)          | YES  |     | NULL    |       | 
| ssl_keysize      | smallint(5) unsigned | YES  |     | NULL    |       | 
| ssl_maxkeysize   | smallint(5) unsigned | YES  |     | NULL    |       | 
| status           | smallint(5) unsigned | YES  |     | NULL    |       | 
| time_stamp       | int(10) unsigned     | YES  |     | NULL    |       | 
| virtual_host     | varchar(255)         | YES  |     | NULL    |       | 
| bytes_in         | int(10) unsigned     | YES  |     | NULL    |       | 
| bytes_out        | int(10) unsigned     | YES  |     | NULL    |       | 
+------------------+----------------------+------+-----+---------+-------+

テーブルはどうなっているのだろう。

mysql> show table status\G
           Name: access_logs
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 11
 Avg_row_length: 176
    Data_length: 1940
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2009-06-01 20:22:14
    Update_time: 2009-06-01 20:26:17
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment:

ほうほう。自動で作られるとMyISAMになるようだ。

他にも設定できる。

これを設定しないと日毎うん百万リクエストのサーバはレコードがうん百万できちゃいます。

LogSQLRequestAccept .html .jpg .gif .png
LogSQLRequestIgnore .exe .ico .php

SetEnvIf、SetEnvIfNoCaseと同じような動きになります。正規表現使えないのかな?

LogFormatみたいなことをやりたい場合は、

LogSQLTransferLogFormat StUR

この場合は、unixtime・いつもの日付・リクエスト部分のみ・リファラ、がレコードに記録されます。

スキーマ情報みたらフィールドはすべて持っていて、設定したフィールドだけ記録されている。ほかのフィールドはNULLで記録。

LogSQLTransferLogFormatの内容。

この内容は公式のドキュメントにもあります。

A User agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
a CGI request arguments request_args varchar(255) user=Smith&cart=1231&item=532
b Bytes transfered bytes_sent int unsigned 32561
c Text of cookie $^{\textrm{1}}$ cookie varchar(255) Apache=sdyn.fooonline.net.1300102700823
H HTTP request protocol request_protocol varchar(10) HTTP/1.1
h Name of remote host remote_host varchar(50) blah.foobar.com
I Request ID (from mod_unique_id) id char(19) POlFcUBRH30AAALdBG8
l Ident user info remote_logname varchar(50) bobby
M Machine ID $^{\textrm{2}}$ machine_id varchar(25) web01
m HTTP request method request_method varchar(6) GET
P httpd child PID child_pid smallint unsigned 3215
p httpd port server_port smallint unsigned 80
R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
S Time of request in UNIX format time_stamp int unsigned 1005598029
s HTTP status of request status smallint unsigned 404
T Seconds to service request request_duration smallint unsigned 2
t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
U Request in simple form request_uri varchar(255) /books-cycroad.html
u User info from HTTP auth remote_user varchar(50) bobby
v Virtual host servicing the request virtual_host varchar(50) http://www.foobar.com

あとはパフォーマンスが気になるところ。

これでもしapacheが捌けるリクエストが1/10とかなったらorz

実用に耐えられるかちゃんと計測しておこう。

CentOS, apacheのログをリアルタイム閲覧するapachetop

よくあるtopコマンドのように、apacheのログファイルをリアルタイムに解析するツール。

http://www.webta.org/projects/apachetop

yumでやりたかったので探したらrpmforgeにあった。

# yum --enablerepo=rpmforge search apachetop
apachetop.i386                           0.12.6-2.el5.rf        rpmforge

osxなら、sudo port install apachetop

解析できるログフォーマットはapacheデフォルトのcommonかcombinedだけのようです。

使い方

# apachetop -f 2009-05-29.txt

結構いい感じにリクエストを解析してくれてる。

どうもおかしいと思ってたら、mongrel_clusterが止まってるよ・・

ついでにPoundの設定も見直しつつ、様子見かなぁ。

つーか、Pound+mongrel_cluster+Apache2の組み合わせは流行らないのか。

Ruby on Railsに移行できたー

つまり、

http://www.twintail.tv → rails

blog.twintail.tv → apache,php

な感じになったわけです。

ログはあとでまとめてアップします。

必要なのは、rails,apache2.0系,poundでした。

apache2.2系ならもっと簡単なのですが、もとが2.0系なので上記の構成です。

できてよかったー!

#完全にMT度外視してしまった。。。

Apache2.2+Tomcat5.5 インストールメモ

とりあえず以下のような感じでインストール&設定してみました。

http://www.apache.org/
http://tomcat.apache.org/
http://java.sun.com/javase/downloads/

Apache2.2のインストール

tar zxvf httpd-2.2.2.tar.gz
cd httpd-2.2.2
./configure –prefix=/usr/local/apache2 –enable-mods-shared=all –enable-proxy=shared –enable-proxy-ajp=shared –enable-dav=shared –enable-dav-fs=shared –enable-rewrite=shared –enable-so
make
make install

JDKのインストール

./jdk-1_5_0_97-linux-i586.bin
export JAVA_HOME=/path/to/jdk
export PATH=$PATH:$JAVA_HOME/bin

Tomcat5.5のインストール

tar zxvf apache-tomcat-5.5.17.tar.gz
tar zxvf apache-tomcat-5.5.17-admin.tar.gz
ln -s /path/to/apache-tomcat-5.5.17 tomcat
export CATALINA_HOME=/path/to/tomcat
export TOMCAT_HOME=/path/to/tomcat

httpd.confの編集
confファイルの構成が変わっているようです。

conf/httpd.conf
conf/extra/httpd-*.conf

アクティブにするファイルのコメントを外して、Tomcat用の設定ファイルを作成します。

vi conf/extra/httpd-tomcat.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
<ocation /jsp-examples/>
ProxyPass ajp://localhost:8009/jsp-examples/
</Location>
vi conf/httpd.conf
Include conf/extra/httpd-tomcat.conf

次回以降、mod_proxy_balancerでバランサーの設定もしてみたいと思います。

WebDAV

httpd-2.0.xで確認
まずmod_davとmod_dav_fsがDSOで組み込まれているか、組み込みコンパイルされているか確認。

なければ

./configure –with-dav –with-dav-fs

などで追加する。

httpd.confに以下を追加

DAVLockDB /var/lock/dav/DAVLock
<IfModule mod_dav.c>
<Location /dav>
DAV on
SSLRequireSSL #SSLに対応させるなら追加
</Location>
</IfModule>
Alias /webdav /var/webdav

必要に応じて認証などをかけておく。
SSLに対応していないなら、deny,allowなどでローカル限定にするのがいいかも。

マイネットワーク→ネットワークプレスの追加でアクセスする。
このままだと日本語が文字化けするのでmod_encodingで対策する。

wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
tar zxvf mod_encoding-20021209.tar.gz
#apache2.0用のファイルをダウンロード
wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616
cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c
cd mod_encoding-20021209/lib
#iconv_hookをインストール
./configure
make
make install
#/usr/local/libにライブラリパスを通しておく
vi /etc/ld.so.conf
/usr/local/lib
ldconfig

mod_encodingのインストール再開

cd ..
./configure –with-apxs=/usr/local/apache2/bin/apxs –with-iconv-hook=/usr/local/include
make
#make installでエラーになりインストールできないので自力でインストール
gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -L/usr/local/lib -Llib -liconv_hook
cp mod_encoding.so /usr/lib/apache2/modules/
#httpd.confに追加する
LoadModule encoding_module modules/mod_encoding.so
<IfModule mod_encoding.c>
EncodingEngine on
NormalizeUsername on
SetServerEncoding UTF-8
DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
AddClientEncoding “cadaver/” EUC-JP
</IfModule>

apacheを再起動しておわり。
日本語が文字化けなくなった。

apache-antのメモ

postgreSQLをインストールする際、tomcatと連携させたいのでインストール。

export ANT_HOME=/usr/local/ant-1.6.1
./build.sh
./build.sh install

ln -s ant-1.6.1 ant

export ANT_HOME=/usr/local/ant
export PATH=$PATH:$ANT_HOME/bin

apache-1.3.31のメモ

外部モジュールを動的に組み込めるDSO向けに設計。

./configure --enable-module=so --enable-rule=SHARED_CORE --enable-module=rewrite --enable-shared=rewrite
make
make install

httpd.confはapache-2.xあまり変わらない。

httpd-2.0.49とOpenSSLのメモ

# ./configure --with-mpm=worker --enable-module=so --enable-shared=yes
# make
# make install

問題なくインストールできた。

# vi conf/httpd.conf

DirectoryIndex index.php index.shtml index.html index.cgi index.jsp #PHPとtomcatを入れるので追加
AddHandler cgi-script .cgi
AddType application/x-httpd-php
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
AddDefaultCharset none

# apachectl start

問題なく起動。
必要に応じてDirectoryを編集したり、アクセス制限したり、カスタムログを出すようにしたり。

Apache2.x + SSL 私的メモ
*テストケース

OpenSSLのインストール
tar zxvf openssl-0.9.7d.tar.gz
./config --prefix=/usr/local --openssldir=/usr/local/openssl -fPIC
make
make test
make install

apache 再コンパイル
./configure --enable-dav --enable-dav-fs --enable-rewrite --enable-ssl --enable-so --with-mpm=worker --with-ssl=/usr/local/openssl
make
make install

秘密鍵と証明書作成
ディレクトリやファイル名は適当でいい。
ディレクトリ:/usr/local/ssl/cert/
openssl req -new -text -out ssl.req -keyout ssl.key
openssl rsa -in ssl.key -out ssl.key
#(追記)デフォルトの有効期限を30日から1年にする
openssl req -x509 -in ssl.req -text -key ssl.key -out ssl.crt -days 365

ssl.confを編集
vi ssl.conf
DocumentRoot /usr/local/apache2/htdocs
ServerName xxx.com:443
ServerAdmin admin@xxx.com
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
# 上記で保存したファイルのパスを指定
SSLCertificateFile /usr/local/ssl/cert/ssl.crt
SSLCertificateKeyFile /usr/local/ssl/cert/ssl.key

サーバーの起動
apachectl startssl

確認(どっちでもいいです)
netstat -at | grep http
nmap localhost | grep http

サイトにアクセス
https://xxx.com/

今回はテストで作成しているので、実際は正式な認証局でCA用証明書を作成したりして結構手間がかかるが、第三者機関に申請するのもあり。

代表的な認証機関
日本ベリサイン株式会社
セコムトラストネット株式会社