Apache HTTP サーバ バージョン 2.4

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4 > モジュール

# Apache モジュール mod_so

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

説明: | 起動時や再起動時に実行コードとモジュールをサーバにロードする
ステータス: | Extension
モジュール識別子: | so_module
ソースファイル: | mod_so.c
互換性: | このモジュールは Window では (常に含まれている) Base モジュールです

### 概要

いくつかのオペレーティングシステムでは、サーバの再コンパイルをする代わりに、 このモジュールを使用して 動的共有オブジェクト (DSO) 機構により、実行時に Apache HTTP Server にモジュールを読み込ませることが できます。

Unix 上では、読み込まれるコードは通常は共有オブジェクトファイル (普通 `.so` という拡張子が付いています) からです。 Windows 上ではこのモジュールの拡張子は `.so` か `.dll` です。

### 警告

Apache HTTP Server のあるメジャーバージョン向けにビルドされたモジュールは一般に 他のメジャーバージョンでは動きません。(例えば 1.3 と 2.0、 2.0 と 2.2) またメジャーバージョン間ではAPIの変更がしばしば発生し、そのため新しい メジャーバージョン向けにモジュールの修正が必要になることがあります。

### トピック

- Windows 用のロード可能なモジュールを作成する

### ディレクティブ

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

## Windows 用のロード可能なモジュールを作成する

### 注

Windows において動的にロードされるモジュールの拡張子は普通 `.dll` ですが、Apache httpd のモジュールは `mod_whatever.so` といった名前を持ちます。これは、他のプラットフォームでの通常の形式に あわせたものです。しかしながら、サードパーティ製モジュール、例えばPHPなど、 は今でも `.dll` の拡張子を使っています。

まだ `mod_so` で `ApacheModuleFoo.dll` という名前の モジュールもロードされますが、新しい名前の付け方を使う方が好まれます。 モジュールを 2.0 用に移植しているのであれば、2.0 の習慣に合うように名前を 修正してください。

Apache httpd のモジュール API は UNIX と Windows 間では変更されていません。 多くのモジュールは全く変更なし、もしくは簡単な変更により Windows で実行できるようになります。ただし、それ以外の Windows には無い Unix アーキテクチャーの機能に依存したモジュールは動作しません。

モジュールが実際に動作するときは、 二つの方法のどちらかでサーバに追加することができます。まず、Unix と同様にサーバにコンパイルして組み込むことができます。Windows 用の Apache httpd は Unix 用の Apache にある `Configure` プログラムがありませんので、モジュールのソースファイルを ApacheCore プロジェクトファイルに追加し、シンボルを `os\win32\modules.c` ファイルに追加する必要があります。

二つ目はモジュールを DLL としてコンパイルする方法です。 DLL は共有ライブラリで、実行時に ``LoadModule`` ディレクティブによりサーバに読み込むことができます。これらのモジュール DLL はそのまま配布することが可能で、サーバを再コンパイルすることなく、Windows 用の Apache httpd のすべてのインストールで実行することができます。

モジュール DLL を作成するためには、 モジュールの作成に小さな変更を行なう必要があります。 つまり、モジュールのレコード (これは後で作成されます。 以下を参照してください) が DLL からエクスポートされなければなりません。 これを行なうには、`AP_MODULE_DECLARE_DATA` (Apache httpd のヘッダファイルで定義されています) をモジュールのモジュールレコード 定義の部分に追加してください。たとえば、モジュールに

`module foo_module;`

があるとすると、それを次のもので置き換えてください。

`module AP_MODULE_DECLARE_DATA foo_module;`

Unix 上でもこのモジュールを 変更無しで使い続けられるように、このマクロは Windows 上でのみ効力を持ちます。`.DEF` ファイルの方を良く知っているという場合は、 代わりにそれを使ってモジュールレコードを エクスポートすることもできます。

さあ、あなたのモジュールの DLL を作成しましょう。これを、 libhttpd.lib 共有ライブラリがコンパイルされたときに作成された ibhttpd.lib エクスポートライブラリとリンクしてください。この時に、 Apache httpd のヘッダファイルが正しい位置にあるように、 コンパイラの設定を変える必要があるかもしれません。 このライブラリはサーバルートの modules ディレクトリにあります。 ビルド環境が正しく設定されるように、既存のモジュール用の .dsp を 取ってくるのが一番良いでしょう。もしくは、あなたの .dsp と コンパイラとリンクのオプションを比較する、というものでも良いです。

これで DLL 版のモジュールが作成されているはずです。 サーバルートの `modules` ディレクトリにモジュールを置いて、 ``LoadModule`` ディレクティブを使って読み込んでください。

## LoadFile ディレクティブ

説明: | 指定されたオブジェクトファイルやライブラリをリンクする
構文: | `LoadFile filename [filename] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Extension
モジュール: | mod_so

LoadFile ディレクティブは、サーバが起動されたときや再起動されたときに、 指定されたオブジェクトファイルやライブラリをリンクします。 これはモジュールが動作するために必要になるかもしれない追加の コードを読み込むために使用されます。Filename は絶対パスか、ServerRoot からの相対パスです。

例:

    LoadFile libexec/libxmlparse.so

## LoadModule ディレクティブ

説明: | オブジェクトファイルやライブラリをリンクし、使用モジュールの リストに追加する
構文: | `LoadModule module filename`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Extension
モジュール: | mod_so

LoadModule ディレクティブは filename というオブジェクトファイルおよびライブラリをリンクし、module という名前のモジュールの構造をアクティブなモジュールのリストに追加します。 Module はファイル中の `module` 型の外部変数の名前で、モジュールのドキュメントに モジュール識別子として書かれているものです。例 :

    LoadModule status_module modules/mod_status.so

これは ServerRoot の modules サブディレクトリから指定された名前の モジュールをロードします。