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 件のコメント:
コメントを投稿