Wednesday, January 16, 2013

Apache 2.4 系をソースからインストールする際の DSO に関して

Apache HTTP Server 2.4 系で現在最新の安定リリースは, バージョン 2.4.3 のようです. これをソースからビルドしてインストールするということをしてみました. 2.4 系をさわるのは今回がはじめてです. そこで, その際に試したことをいくつかここに書こうかなと最初は思ったのですが, ひとつ気になる点があったので, それについてだけ書こうと思います. DSO (Dynamic Shared Object) として扱うことのできるモジュールについてです.

ソースからビルドするに際しては, まず configure スクリプトを実行すると思います. たとえば次のように実行します.

$ ./configure --prefix=/opt/httpd-2.4.3 \
  --enable-mods-shared=all \
  --enable-mpms-shared=all

2.4 系ではほとんどのモジュールが DSO として扱うことができるようです. どのモジュールを DSO として扱いたいかは --enable-mods-shared オプションで指定します. このオプションでは, 個別にモジュールを列挙してもいいのですが, それは面倒くさいので, ある程度まとめて指定したいところです. 実際にそれはできます.

オンラインドキュメントの configure - Configure the source tree には, 次のように説明されています.

Additionally you can use the special keywords reallyall, all, most, few and none. For example,

--enable-mods-shared=most

will compile most modules and build them as DSO modules,

--enable-mods-shared=few

will only compile a very basic set of modules.

The default set is most.

そうなると, ここで気になるのは, reallyall, all, most, few, none のそれぞれが, どこまでの範囲をカバーするのかということです. で, 少し調べてみました.

most の場合

--enable-mods-shared オプションを使用しない場合, 暗黙的に most が選択されたとみなされるので, おそらくこれが最も一般的なケースなのかなと思います.

クリーンインストールしたばかりの手元の Debian GNU/Linux 6.0 (Squeeze) で試してみましたところ, インストール先の modules ディレクトリ内には, 81 個の共有ライブラリが作成されていました. ただし, 別途 --enable-mpms-shared=all というオプションを指定し, そのためわたしの環境では mod_mpm_event, mod_mpm_prefork, mod_mpm_worker という MPM 用の 3 個の共有ライブラリが作成されていましたので, これを除いて考えると, 78 個です.

ちなみに, モジュールの一覧表は Module Index というオンラインドキュメントにありますが, その Other Modules セクションには 112 個のモジュールが掲載されています. うち, mod_so は, DSO としてではなく, 必ず静的に含まれるモジュールのようです. Dynamic Shared Object (DSO) Support というオンラインドキュメントに,

The DSO support for loading individual Apache httpd modules is based on a module named mod_so which must be statically compiled into the Apache httpd core. It is the only module besides core which cannot be put into a DSO itself. Practically all other distributed Apache httpd modules will then be placed into a DSO.

と記載されています. ですので, 以後は 111 個のモジュールのうち, どれが含まれて, どれが含まれないか, という観点で見て行きたいと思います.

で, most の場合は, 含まれないモジュールが 33 個ありました.

mod_asis, mod_authnz_ldap, mod_cern_meta, mod_cgi, mod_charset_lite, mod_data, mod_dav_lock, mod_deflate, mod_dialup, mod_echo, mod_example, mod_heartbeat, mod_heartmonitor, mod_ident, mod_imagemap, mod_isapi, mod_ldap, mod_log_forensic, mod_lua, mod_mime_magic, mod_nw_ssl, mod_privileges, mod_proxy_fdpass, mod_proxy_html, mod_reflector, mod_session_crypto, mod_slotmem_plain, mod_socache_dc, mod_ssl, mod_suexec, mod_usertrack, mod_watchdog, mod_xml2enc

all の場合

--enable-mods-shared=all の場合はどうでしょうか. all とは言え, reallyall よりは少ないんだろうなという察しはつきます. 実際には, 含まれないモジュールが 18 個ありました.

mod_authnz_ldap, mod_cern_meta, mod_cgi, mod_deflate, mod_example, mod_ident, mod_imagemap, mod_isapi, mod_ldap, mod_lua, mod_nw_ssl, mod_privileges, mod_proxy_html, mod_session_crypto, mod_socache_dc, mod_ssl, mod_suexec, mod_xml2enc

reallyall の場合

--enable-mods-shared=reallyall の場合はどうでしょうか. さすがに, ほぼすべてが含まれるのだろうなと思っておりましたが, 実際には, 含まれないモジュールが 12 個もありました.

mod_authnz_ldap, mod_deflate, mod_example, mod_ldap, mod_lua, mod_nw_ssl, mod_privileges, mod_proxy_html, mod_session_crypto, mod_socache_dc, mod_ssl, mod_xml2enc

やや意外な気がしなくもありません. あとでまた考えてみたいと思います.

few の場合

--enable-mods-shared=few の場合はどうでしょうか. 実際には, 含まれないモジュールが 90 個もありました. 逆に言えば, 以下の 21 個のモジュールが含まれていたということです.

mod_access_compat, mod_alias, mod_auth_basic, mod_authn_core, mod_authn_file, mod_authz_core, mod_authz_groupfile, mod_authz_host, mod_authz_user, mod_autoindex, mod_dir, mod_env, mod_filter, mod_headers, mod_log_config, mod_mime, mod_reqtimeout, mod_setenvif, mod_status, mod_unixd, mod_version

要は, これらが最も基本的なモジュールたちである, ということになるのでしょうか.

none の場合

--enable-mods-shared=none の場合はどうでしょうか. まったく含まれないかと思いきや, 実際には most の場合とまったく同じでした. やや不可解です. ひょっとしたら, none というキーワードは, 有効に機能していなくて, その結果デフォルトの most が暗黙的に指定されたとみなされたのでしょうか. 何かを勘違いしているのかもしれませんが, ちょっとよくわかりません.

reallyall の場合 (再)

先ほど, reallyall の場合は, 含まれないモジュールが 12 個もありました, と書きました. ところが, それとは逆に, Module Index に記載のないモジュールが, 9 個ほど含まれていました.

mod_bucketeer, mod_case_filter, mod_case_filter_in, mod_example_hooks, mod_example_ipc, mod_optional_fn_export, mod_optional_fn_import, mod_optional_hook_export, mod_optional_hook_import

うち, mod_example_hooksmod_example_ipc の 2 個については, mod_example の例として含まれているのだと考えることができるかもしれません. また, 残りの 7 個については, 2.4 系のオンラインドキュメントには見当たらないのですが, 2.2 系の configure - Configure the source tree のほうに, いずれも Modules for developers として紹介されていました. ひょっとしたら, これらは DSO として扱うのではなく, 本来は個別に静的に, たとえば --enable-bucketeer などと指定して利用するべきものなのかもしれません. まあ, 試してはいないのですが.

その他のモジュール

reallyall にすら含まれないモジュールを含めたい場合は, どうするのがよいでしょうか. おそらくは, たとえば mod_XXX というモジュールであれば, 次のようなオプションを指定するのが基本になるのかなと思います.

--enable-mods-shared='reallyall XXX' --with-XXX

--with-XXX を付加することにより, Apache HTTP Server のビルドの過程でおこなわれる Apache Portable Runtime (aprapr-util) が, 必要に応じていろいろよきに計らってくれるものらしいです. そこで, いくつか試しかけてみましたが,

  1. mod_authnz_ldapmod_ldap の場合

    LDAP クライアントの共有ライブラリやヘッダファイルがあらかじめインストールされていないといけないらしく, configure スクリプトが途中でエラーとなる.

  2. mod_deflate の場合

    zlib があらかじめインストールされていないといけないらしく, configure スクリプトが途中でエラーとなる.

  3. mod_proxy_html の場合

    zliblibxml2 があらかじめインストールされていないといけないらしく, configure スクリプトが途中でエラーとなる.

  4. mod_ssl の場合

    OpenSSL 0.9.8 以降が (ヘッダファイル等も含めて?) あらかじめインストールされていないといけないらしく, configure スクリプトが途中でエラーとなる.

という具合で, いずれも, 外部環境に依存しているように見受けられます. なるほど, だからこそ, allreallyall には含まずに, 個別に取捨選択するようになっているのかもしれません.

まとめ

以上です. おしまい.

No comments:

Post a Comment