|
||||||
ホーム / Web 開発の小技 | ||||||
|
* 更新情報
情報システムを構築する上での再利用可能な部品として Web は必要不可欠なものになっています。私もここ10年は Web 関連のシステムばかり作っています。システムの開発に十分な時間が割けないとき、システムを Web ベースにすることでプログラミング量を激減させることができますし、インストールやサポートも随分楽になります。これは、Web サーバや Web ブラウザとしてまさに State-of-Art で Solid なソフトウェアが提供されているからに他なりません。 Web サーバや Web ブラウザを使って、ちょっとだけダイナミックなページを作るのは簡単ですが、インタラクティブなアプリケーションと呼べるものを作るのはかなり大変です。ここでは、開発経験やいま勉強していることから Web 開発の小技(tips)についてまとめてみました。 スクリプト言語モジュール (mod_p*) を使えば CGI よりは高性能なサーバーサイドのプログラムを比較的手軽に作ることは出来ますが、既に出来上がっている手持ちの C のコードがある場合や、より高性能なものを作るとなるとサーバに組み込まれて動くモジュールを作ることになります。ここでは、Aapche バージョン 2.x 用のモジュールを作る際の、最初のステップについて解説します。 モジュールの開発途上ではデバッガ(gdb)で追いかけることになるので、マシンにインストールしてある httpd は使わずに、モジュール開発専用の httpd をソースからビルドすることにします。また、モジュール自身も httpd にスタティックにリンクすることにします。 Apache のソースを展開します。ここでは現時点での最新版である ~$ cd src src$ tar jzvf httpd-2.2.3.tar.bz2 ... src$ cd httpd-2.2.3/ httpd-2.2.3$ 既に httpd-2.2.3$ env LIBTOOLIZE=libtoolize LIBTOOL=libtool AUTOCONF=autoconf259 AUTOHEADER=autoheader259 ./buildconf ... httpd-2.2.3$ これで、 httpd-2.2.3$ env CC=gcc41 CFLAGS='-ggdb -O0' ./configure --with-mpm=prefork --disable-cgi --disable-so ... httpd-2.2.3$ make ... httpd-2.2.3$ ビルドが完了すると、カレントディレクトリ(ソーストップディレクトリ)に実行ファイル (
httpd.conf
ServerRoot "./" デバッガから起動するので、カレントをルートにしておきます
Listen 8080 80 番はスーパーユーザじゃないと使えないし、既に走っているかもしれないし
#- @@LoadModule@@ コメントアウトします。
#- User %%WWWOWN%% コメントアウトします。
#- Group %%WWWGRP%%
DocumentRoot "docs/docroot" 取り合えずは標準のドキュメントを使います
<Directory "docs/docroot">
これで準備完了。取り合えず動かしてみます。起動のコマンドラインは httpd-2.2.3$ ./httpd -X -d . -f httpd.conf
httpd-2.2.3$ gdb httpd GNU gdb 6.1.1 [FreebSD] ... (gdb) run -X -d . -f httpd.conf Starting program: /mnt/work/WORK/DIOWave/NewViewerCore/apache2-module/httpd-2.2.3/httpd -X -d . -f httpd.conf いよいよ自前のモジュールを作ります。ここではコンテンツハンドラではなく出力フィルタを作ります。まずは、全く何もフィルタしないフィルタを作ってみてフィルタの基本動作を学ぶことにします。 モジュールは modules/site/mod_dumfilter.cpp
#include "httpd.h" #include "http_config.h" #include "http_log.h" #include "apr_strings.h" #include "apr_general.h" #include "util_filter.h" #include "apr_buckets.h" #include "http_request.h" 普通は modules/site/config.m4
APACHE_MODPATH_INIT(site)
APACHE_MODULE(dumfilter, Dummy Filter, , , static, [
APR_SETVAR(MOD_DUMFILTER_LDADD, [-lstdc++]) C++ をつかっているのでランタイムライブラリが必要になります。
])
APACHE_MODPATH_FINISH
ただし、このままだと素直には行きません。なぜなら、このモジュールは C++ のソースですが、Apache の中では C++ のコードは一切使われていないのでビルドシステムが対応していないのです。そこで、ビルドシステムのソースである configure.in
AC_PROG_CC
AC_PROG_CPP
AC_PROG_CXX これを追加して C++ に対応させます
また、 httpd-2.2.3$ env CXX=g++41 CXXFLAGS='-ggdb -O0' CC=gcc41 CFLAGS='-ggdb -O0' ./configure --with-mpm=prefork --disable-cgi --disable-so このフィルタを有効にするため、 <Directory "docs/docroot/file"> SetOutputFilter DUMFILTER Order Deny,Allow Allow from all </Directory> これで、ダミーのフィルタの完成です。デバッガの中で動かして見ましょう。 |
|||||
Copyright © 2007 Takaya Sakusabe All rights reserved.
Generated: Jan 5, 2007 2:15:59 PM UTC. |