最後に

Apacheについては、コアと拡張モジュールという構成を土台として、ドキュメントに対する処理(ハンドラ、フィルタ)とその範囲(コンテキスト)という縦軸横軸が張られている、そんな風にイメージすると分かりやすいのじゃないか。そこさえ押さえていれば、「今この設定は何をしているのか」ということについて混乱することはなくなる、そんな気がする。

6. Apacheの設定

Apacheの設定はサーバ本体側に設定ファイルとドキュメントディレクトリ側に置く設定ファイルの二種類からなる。
本体側(FeeBSDなら/usr/local/etc/apache22配下)に置かれる設定ファイルには、メインとなるhttpd.confと拡張機能用の設定ファイルがある。拡張機能用の設定ファイルはhttpd.confからInclude(Coreのディレクティブ)指定することで読み込まれる。これらのファイルは起動時、あるいは再起同時に読み込まれる。
ドキュメントディレクトリ側に置かれるファイルは、デフォルトでは.htaccessとなる。これは配置されたディレクトリに設定が限定されるが、すべてのリクエストで読み込まれる(=即時反映)。

5. Apacheの処理

Webサーバの根本を考えると、しょせん、WebサーバはURLとファイルシステム上のドキュメントを紐づけるクダに過ぎない。したがって、DocumentRootやAliasやVirtualHostといったディレクティブはまさにその紐付けとして基本の役割を担っているわけだ。
しかし、そこから一歩踏み出すと「そのクダの中で何らかの処理もやる」、「どのクダで何の処理をやるのか決めておく」といったやや複雑な処理用の設定が必要となる。その前者がフィルタやハンドラであり、後者がコンテキストという定義になる。
フィルタとハンドラの区別は今いち分かりづらい。さっくり言うと、フィルタはデータの転送時にデータに対して行われる(転送するデータをいじくる)処理であり、これにはSSLやSSIがある。ハンドラは特定のリクエストに対して行う特定の処理(いじくったデータを転送する)であり、これにはCGIやサーバ設定情報の表示(mod_info)などがある。ちなみに、デフォルトの処理(静的コンテンツの転送)もハンドラの処理の結果である。
コンテキストはフィルタやハンドラの設定を限定する範囲のことである。サーバ全体、バーチャルホスト内、ディレクトリ内、.htaccess内と設定できる。

4. Apacheのプロセス

Apacheのプロセスの形態は選択するmpmにより異なる。unixのデフォルトはApacheの旧バージョンを引きずった、スレッドを使わない形式mpm_prefork_moduleを組み込んでいる。
これは親プロセスと子プロセスに分かれており、親プロセスは、子プロセスの起動、リッスンポートの開放、リクエストの子プロセスへの割当、ログファイルのオープン等を担当する。ちなみに、ポート80番で待ち受ける場合、プロセスの所有者はrootである必要がある。
子プロセスはリクエストへの応答が主の役割であり、最初から複数起動している。初期起動数や最大起動数は設定により増減可能。セキュリティ上の要請により、プロセスの所有者はroot以外が推奨されている。

3. モジュールの組み込み

モジュールを組み込む方法としては、静的モジュールの組み込みと動的モジュールの組み込みと二通りある。別にapache特有の考え方ではなく、C言語におけるライブラリの考えがベースにある。
静的モジュールの組み込みは、httpdコンパイル時にconfigureスクリプトで組み込むモジュールを指定することで行う。コアやmpmは静的モジュールになる。
動的モジュールの組み込みは、共有ライブラリ(拡張子が.so)をhttpd起動時に読む込むことで行う。読み込むライブラリは設定ファイルのLoadModuleディレクティブで指定する。この機能はコアではなく、mod_soモジュールによって実装される。起動時に読み込まれるので、追加削除に再コンパイルが不要というメリットがある。

なお、FreeBSDで標準インストール(無指定でportsからインストール)した場合の静的モジュールは以下のようになる。

# apachectl -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

2. Apacheの実体

Apacheのパッケージは本体であるhttpd、管理インターフェースであるapachectl、及びその他の補助ツールからなる。
httpdはバイナリファイルであり、スタンドアロンのデーモンプロセスとして起動し、HTTPリクエストの処理を担当する。
apachectlはシェルスクリプト(Bourneシェル)であり、apacheの起動や停止を担当する。管理インターフェースといいつつも、実体は単なるシェルなので、実はコマンドラインからhttpdを直接操作することも可能だったりする。
その他の補助ツールは動的モジュールを生成するapxsや、ダイジェスト認証のユーザを作成するhtdigest、あるいはログローテーション用のrotatelogs等々がある。

1. Apacheの設計

必ず押さえておくべき点として、Apacheは基本部分であるコアと拡張機能を提供するモジュールから成り立っているということ。コアは基本的なHTTPリクエストの処理を行い、SSLCGIといった機能は拡張モジュールを組み込むことによって実装される。
Apacheのバージョン2からはコアもモジュール化されており、mpm(Multi Proccessing Module)として定義されている。mpmは必ず一つだけ選択しなくてはならず、これにより、プラットホーム(OS、システム環境)の違いを吸収できるようにしている。
ちなみに、拡張モジュールにはApache標準のモジュールとサードパーティ製のものがある。たとえば、PHPを使用するためのmod_phpサードパーティ製であり(多分)、インストールの段階では組み込まれていない。