ApacheはWebサーバーとして低コストで高いパフォーマンスを発揮するとともに、多くの機能を備えています。
Webサーバーに求められる機能は、HTML文書や画像などの情報を配信するといった基本的なものだけではありません。圧縮転送や、認証機能、プロキシサーバーやファイルサーバーなど、多く機能が求められています。
ただ、それらの機能を全て一度に使うケースは少ないでしょう。ある要件では必要な機能も、別の要件では不要であり、無駄になってしまいます。その無駄な部分を使わないのに、使える状態にしておくと、必然的に起動にかかるコストや必要なメモリーなどが増え、サーバーリソースを消費してしまいます。
特に、Webサーバーは不特定多数のクライアントからの要求に応える必要があり、そのためにより多くのプロセスやスレッドを立ち上げます。そのため、プログラムサイズが少しでも大きくなると、プロセスの多重起動により、消費するサーバリソースは肥大化してしまいます。
そこでApacheは、必要最低限な機能だけをコアに据え、残りは選択可能とするモジュール構造を採用しています。モジュールとは、ある機能を実現するためのソフトウェアで、プログラム本体に組み込んだり、交換することが可能な小さなプログラムのことです。
また、 プラットフォーム(環境やOSによる機能や実装の違い)に依存するコア機能の部分もモジュール化され、プラットフォームに応じて最適なものを選択することが可能となっています。
サーバーデーモンの実行部分(コア機能)を司るモジュールをMPM(マルチプロセッシングモジュール)と言います。MPMは各プラットフォームに最適化されているため、パフォーマンスを最大限に発揮することができます。
以降、2種類のモジュールを混合しないように、マルチプロセッシングモジュールを「MPM」、一般的な機能拡張モジュールを単に「モジュール」と記載します。
このようなモジュール構成となっているため、必要な機能を取捨選択して、適材適所なApacheを構成することが可能となります。
静的モジュールとDSOモジュール
Apacheの多くの機能はモジュールによって実現されます。モジュールはApacheの設定ファイルを編集することで、簡単に有効/無効を切り替えることができます。
モジュールをApacheに追加する方法として、Apacheをビルドするときに実行ファイルの中にモジュールを組み込んでしまう方法と、モジュールを単独ファイルとして作成し、Apacheの起動時に動的に追加する方法の2種類があります。前者を静的モジュール、後者をDSO(Dynamic Shared Object)モジュールと言います。
ビルド時にApache実行ファイルに組み込んだモジュールは、Apacheと密接な連携をとることができるため、起動時に動的に追加するモジュールよりも高速に動作します。ただし、一度組み込んだモジュールは再びビルドし直すまで外すことができません。
Apacheにロードされているモジュールの一覧は「httpd -M」コマンドで確認できます。
# httpd -M Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) ~ 省略 ~ suexec_module (shared) disk_cache_module (shared) cgi_module (shared) version_module (shared) dnssd_module (shared) ssl_module (shared) Syntax OK
静的に組み込まれている場合は「static」、DSOで動的に組み込まれている場合は「shared」と表示されます。