ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2008-05-14

Apache mod_dbd設定編

以前にmod_dbdについてどういうものかを紹介したが、今回はMySQLを用いたmod_dbdの設定方法について説明する。

MySQL用のmod_dbdドライバを利用するにはApache httpd Serverをソースからビルドしなければならない。以前のバージョンのApache httpd ServerのソースコードにはMySQL用のmod_dbdドライバ(apr_dbd_mysql.c)が同梱されていなかったため、別途追加が必要であった。(ダウンロード元はここ。)その原因はライセンスの関係であり、Apache LicenseとGPL(MySQL)が非互換であったためである。確認した限りでは、Apache httpd Server 2.2.6にはapr_dbd_mysql.cは同梱されていない。2.2.8には同梱されていることを確認したので、この間に何らかの対処がなされたものと考えられる。ソースコードにコメントとしてLICENSEがApache License 2.0であるという記載があるが、以前のものはMySQLのGPL FOSS Exceptionが適用されていたのでこの辺の変更があったようである。

というわけで、Apache httpd Server 2.2.8からは普通にソースコードをビルドすればmod_dbdでMySQLを利用することができるようになった。configureの際、以下のオプションが必要となる。

--with-mysql=/path/to/mysql
--with-included-apr
--enable-dbd(=shared)

前の投稿でも書いたが、mod_dbdはapr_dbdを用いてコネクションプールをするためのラッパーである。そしてapr_dbdはapr-utilの一部なので、apr_bdb用のドライバを追加するにはapr-utilをビルドする必要がある。(APR=Apache Portable Runtime: http://apr.apache.org/Apache-SVNのリポジトリを見るとconfigureの前にbuildconfしなさいという記述があるが、2.2.8では必要ない。ちなみに俺の環境では以下のようなconfigureオプションを利用した。

shell> ./configure \
--prefix=/usr/local/apache2 \
--with-mpm=worker \
--enable-modules=most \
--enable-mods-shared=most \
--with-mysql=/usr/local/mysql \
--with-included-apr \
--enable-dbd=shared \
... (以下略)

configureが通ればあとはお決まりのmakeおよびmake installするだけである。

次はhttpd.confの設定である。必要なディレクティブは以下のページに説明が載っている。ここでは簡単に各ディレクティブについて説明する。
http://httpd.apache.org/docs/2.2/ja/mod/mod_dbd.html

DBDriver
今回はapr_dbd_mysql.cであるので、apr_dbd_と拡張子の.cを除いたmysqlを指定しよう。

DBDParams
データベースへの接続パラメータである。これは各ドライバによって異なる。

DBDPersist
取り得る値はONまたはOFFである。ONにしないとコネクションプールを使用しなくなる。コネクションプールを利用しなくても、mod_dbdを利用すればデータベースへの接続手段が共通化されるというメリットは残る。

DBDMin, DBDMax, DBDKeep
それぞれプロセスあたりのデータベースに対する同時接続数の初期値、ピーク(最大)値、オフピーク値である。httpdが起動した時点ではDBDMinの数だけ接続が確立される。同時接続数はクライアントからのリクエストに従ってDBDMaxまで増えることができ、その後リクエストが減少するとDBDKeepまで下がる。DBDMin<DBDMax<DBDKeepとなるように設定しよう。keep<maxとなるように設定しよう。 10=100となる。

DBDExptime
同時接続数がDBDKeepを超えた場合に、接続解除されるまでの時間である。サーバの稼働率が高いなら値を長くしよう。

DBDPrepareSQL
各接続においてデフォルトで利用できるプリペアードステートメントを定義するためのディレクティブである。コネクションプールではプリペアードステートメントを明示的に削除しないので、アプリケーションがプリペアードステートメントを定義たにも関わらず削除し忘れると不必要なプリペアードステートメントが残り続けてしまうという事態が生じてしまう。これにより、プリペアードステートメントの数が膨大になり、その結果メモリリークのようにメモリを使い果たしてしまう場合がある。そのような事態を避けるためにはDBDPrepareSQLディレクティブを利用するといい。

以下、mod_dbd用ディレクティブのサンプルである。ユーザー名やパスワードは適宜変更するべし。

DBDriver mysql
DBDParams      host=localhost,user=app,pass=pass,dbname=appdb,sock=/tmp/mysql.sock
DBDPersist     ON
DBDKeep        5
DBDMax         10
DBDMin         3
DBDExptime     600

設定を行ったらapachectl configtestを実行しよう。Syntax OKが表示されればhttpdを起動しても大丈夫だ。起動したらMySQLサーバへログインして、SHOW PROCESSLISTを実行してみよう。設定がうまくいっていれば既にコネクションプールによる接続が確立されているのが分かるだろう。

mod_dbdを利用できるのはApache httpd serverのモジュールだけである。同梱されているモジュールの中では、mod_authn_dbdだけがmod_dbdを利用できる。それ以外にmod_dbdを利用するには自前でモジュールを作成する場合以外にはない。自前でモジュールを作成するような場合はほとんどないが、一応以下に作成手順を紹介しておく。

まずはApacheモジュール用のテンプレートを用意する。これにはapxs(Apache Extension Tool)というコマンドを用いる。詳しい説明はman apxsを参照すること。mod_dbd_testというモジュールを作成する場合にはコマンドは以下となる。

shell> apxs -g -n mod_dbd_test

するとカレントディレクトリ配下にmod_dbd_testというディレクトリが作成され、さらにその下にmod_dbd_test.c、Makefile、modules.mkという3つのファイルが作成される。そしてmod_dbd_test.cを編集して、makeおよびmake installすればApacheのモジュール用ディレクトリへインストールされる。例えば/usr/local/apache2/modulesへ、である。

当然ここで必要になるのがモジュールの開発(mod_dbd_test.cの編集)である。非常に簡単なものではあるが、mod_dbdを利用した例をMySQL Practice Wikiへアップロードしたのでモジュールを開発する際の参考にして欲しい。
http://www.mysqlpracticewiki.com/index.php/Media:Mod_dbd_test.c
※ファイル名の最初の大文字はメディアウィキの制限なので、ファイルを保存するときは名前を全て小文字に適宜変更するべし。

Apacheモジュールの作成にはApacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)が非常に役立ったのだが、今はAmazonに新品の在庫がないようである。残念。

完成したモジュールをインストールしたら、次のステップはhttpd.confの編集である。自動生成されたソースコード(mod_dbd_test.c)自身にもインストラクションが載っているが、httpd.confに以下のような内容を追加することでモジュールを使用することが出来る。(当然他にも色々とやり方はある。)

LoadModule dbd_test_module modules/mod_dbd_test.so
<location /dbd_test>
SetHandler dbd_test
</Location>

httpd.confを編集したら、apachectl configtestおよびapachectl restartをする。これで作成したモジュールが利用できるようになる。

0 コメント:

コメントを投稿