Apache の標準モジュールを(だいたい)全部調べてみた

Docker イメージ httpd:2.4.38httpd.conf には以下のように利用できるモジュールが列挙されています。

LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
...

それぞれのモジュールの目的を簡単に調べました。

mpm_event_module, mpm_prefork_module, mpm_worker_module

Multi-Processing Module (MPM) として何か使うか指定するためのモジュール。Apache 2.4 からは event がデフォルト。

mod_authn_file, mod_authn_dbm, mod_authn_anon, mod_authn_dbd, mod_authn_socache

Basic 認証や Digest 認証でユーザー情報を扱う機会があるが、ユーザー情報を保存するデータストアは認証のモジュールからは切り出されてプラガブルになっている。

よく使われるものは mod_authn_file で、これは AuthUserFile ディレクティブ、つまり .htpasswd を使うのに必要。

おもしろいのは mod_authn_dbd で、これを使うといろいろな SQL データベース にユーザー情報を格納できる。しかし静的コンテンツへのアクセスごとにデータベースへの問い合わせが発生するのは遅いので mod_authn_socache によって認証情報をキャッシュすることができる。

mod_authn_core

認証のためのコアモジュールで、たとえば認証の設定に必要不可欠な AuthType ディレクティブはこのモジュールによって提供されている。

mod_authz_host, mod_authz_groupfile, mod_authz_user, mod_authz_dbm, mod_authz_owner, mod_authz_dbd

こちらは認可のためのモジュール。

  • mod_authz_host … 接続元のホストの IP やドメイン名によって認可が行えるモジュール。Require local と書くとローカルホストからの接続のみ許可することができる
  • mod_authz_groupfile … mygroup: bob joe anne のような書式で書かれたテキストファイルを AuthGroupFile で与えることで特定のグループに含まれるユーザーにアクセスを認可することができる
  • mod_authz_user … Require user によって特定のユーザーにアクセスを許可することができる
  • mod_authz_dbm … GDBM などに認可情報を格納できる
  • mod_authz_owner … アクセスしようとしているファイルのオーナー情報とアクセスしようしているユーザー名の比較によってアクセスを許可することができる
  • mod_authz_dbd … SQL データベース に認可情報を格納できる

mod_authz_core

認可のためのコアモジュールで、たとえば認可の設定に必要不可欠な Require はこのモジュールによって提供されている。

mod_authnz_ldap, mod_authnz_fcgi

認証認可で共用のモジュールもある。それぞれ LDAPFastCGI バックエンドに認証認可を委譲する。

mod_access_compat

古き良き Order, Allow, Deny ディレクティブを使うのに必要。mod_authz_core が提供する Require への移行が推奨されている。

mod_auth_basic

HTTP Basic 認証のプロトコル部分の実装を含むモジュール。認証や認可の実装は mod_authn_* と mod_authz_* に移譲されている。

mod_auth_form

Basic 認証ではなく HTTP POST と Cookie セッションによって認証が行えるモジュール。典型的には httpd_usernamehttpd_password というパラメータで認証情報を送信する <form> を作ることで実装できる。

mod_auth_digest

HTTP Digest 認証の実装を含むモジュール。

mod_allowmethods

利用可能な HTTP メソッドを制限する AllowMethods ディレクティブが使用可能になる。

mod_isapi

IIS の拡張に使われる Internet Server extension API を利用するためのモジュール。もちろん Windows 用。

mod_file_cache

Apache の起動時に指定したファイルをメモリにキャッシュして絶対にオンメモリで処理したいときに使うモジュール。ファイルを変更したときには自動的に反映されたりせず Apache を再起動しなければならないなど不便な点も多い。

mod_cache, mod_cache_disk, mod_cache_socache

バックエンドから返されたコンテンツ RFC 2616 の仕様、すなわち Cache-Control により Apache でキャッシュするモジュール。キャッシュした内容を保存するストレージバックエンドは切り出されている

  • mod_cache_disk … ディスクに書き出す
  • mod_cache_socache … Redis や memcached といった shared object cache にキャッシュを保存するためのモジュール。実際に利用される shared object cache の実装のモジュールも追加でロードする必要がある

mod_socache_shmcb, mod_socache_dbm, mod_socache_memcache

shared object cache のそれぞれのバックエンドに対応するモジュール。

mod_watchdog

定期的にタスクを実行する機能を他のモジュールに提供するモジュール。mod_heartbeat, mod_heartmonitor, mod_md, mod_proxy_hcheck などが利用する。

mod_macro

<Macro> セクションによってテンプレートを作り Use ディレクティブによって実体化可能なマクロを利用するためのモジュール。

mod_dbd

SQL データベースをストレージバックエンドとして利用する mod_authz_dbd のようなモジュールのためにストレージバックエンドの実装を提供するモジュール。

mod_bucketeer

ドキュメントなし。

mod_dumpio

デバッグ用にすべての生のリクエストとレスポンスをログに出力するモジュール。

mod_echo

プロトコルモジュールの実装例として提供されているエコーサーバー。

mod_example_hooks

SetHandler によってコールバックとして設定されるモジュールの実装例。

mod_case_filter, mod_case_filter_in, mod_example_ipc

ドキュメントなし。

mod_buffer

高コストなバックエンドに接続しているとき、低速なクライアントへのレスポンスの遅延がバックエンドのリソース占有時間を増大させることがある。このような場合はレスポンスを Apache でバッファリングしてバックエンドのリソースを早期解放することが有効である。mod_buffer はそのためのバッファリングの仕組みを提供するモジュールである。

mod_data

リソースをリクエストしたときにリソースではなくリソースの RFC2397 data URL 形式のテキストが得られるようになるモジュール。具体的なユースケースは不明。

mod_ratelimit

SetOutputFilter RATE_LIMIT を指定することによりレートリミットを設定することができるモジュール。

mod_reqtimeout

RequestReadTimeout ディレクティブによりタイムアウトを設定できるようになるモジュール。

mod_ext_filter

外部コマンドをフィルターとしてレスポンスを変換してからクライアントに返すことができるモジュール。レスポンスごとにプロセス呼び出しが発生するため遅いが、シンプルに実装できる。

mod_request

静的ファイルのデフォルトのハンドラーなど、リクエストボディを捨てる動きをするハンドラーはいくつかあるが、モジュール側でリクエストボディを使いたいのに使えなくて困ることがある。KeptBodySize を設定すると、指定した容量までリクエストボディが Apache 側で保持されるようになる。

mod_include

Server Side Include (SSI) を利用するためのモジュール。

mod_filter

レスポンスにフィルターをかけるのに使われるモジュール。典型的には gzip 圧縮のために使われる。

mod_reflector

リクエストボディをそのままレスポンスボディとして返すモジュール。典型的にはファイルを POST すると圧縮して返したり、画像を POST するとリサイズして返すような仕組みの開発に使われる。

mod_substitute

レスポンスを強引に置換する機能を提供するモジュール。典型的にはバックエンドから返されたページに含まれるリンクのホスト部が内部用のホスト名になってしまっている場合に強引に書き換えるのに使われる。

mod_sed

mod_substitute は置換のみだったが、こちらはもっと複雑なテキスト編集ができる。

mod_charset_lite

レスポンスのエンコーディングを変換するモジュール。

mod_deflate

DEFLATE フィルタによりレスポンスの圧縮機能を提供するモジュール。

mod_xml2enc

libxml2 が読み込めるようにエンコーディングUTF-8 に変換するモジュール。mod_proxy_html と組み合わせて利用することが想定されている。

mod_proxy_html

Apache をリバースプロキシとして利用している環境においてバックエンドから返された HTML を書き換えるのに使われるモジュール。

mod_mime

Content-Encoding などのヘッダをレスポンスに付与したり、AddType によって拡張子と MIME タイプの関連付けを設定したりする機能を提供するモジュール。AddHandler で拡張子に対してハンドラーを設定する機能もこのモジュールが提供している。

mod_ldap

Apache が利用する LDAP にコネクションプールやキャッシュの機能を追加して強化するモジュール。

mod_log_config

ログ収集のために LogFormat などのディレクティブを提供するモジュール。

mod_log_debug

デバッグ用に error.log にメッセージを出力するためのモジュール。

mod_log_forensic

フォレンジックログと呼ばれる HTTP リクエストの詳細なログを出力するのに使われるモジュール。

mod_logio

送受信したリクエストとレスポンスのサイズをログに記録する機能を提供するモジュール。

mod_lua

SetHandler lua-script により Lua にリクエストの処理を委譲するモジュール。

mod_env

SetEnv などのディレクティブにより CGI に渡す環境変数を設定できる。

mod_mime_magic

file コマンドと同様の方法によって、すなわちファイルの先頭の数バイトから参照することによって MIME タイプを判別するモジュール。もちろん mod_mine によって明示的に MIME タイプを与えたり拡張子から判別するほうが処理が軽いので、このモジュールは mod_mine で判別できなかった場合の「二次防衛線」として利用されることを期待している。

mod_cern_meta

CERN HTTPD Meta file semantics というものがあり、それのエミュレーションのためのモジュール。

mod_expires

Cache-Control と Expires ヘッダをレスポンスに設定するための ExpiresDefault ディレクティブなどを提供するモジュール。

mod_headers

任意のレスポンスヘッダを設定する Header ディレクティブと、任意のリクエストヘッダをリクエスト処理前に注入する RequestHeader ディレクティブを提供するモジュール。

mod_ident

RFC 1413 で定義された Ident 認証と呼ばれる TCP ベースのユーザートラッキングの仕組みにより接続元ユーザーをトラッキングするモジュール。この方式はクライアントの自己申告に依存する方法なので信頼性は低い。

mod_usertrack

Cookie ベースのユーザートラッキングを提供するモジュール。ログに出力ことはできるがリクエストヘッダを付与してバックエンドに渡す機能はなさそう。

mod_unique_id

環境変数 UNIQUE_ID にリクエスト固有の一意のトークンを付与するモジュール。現代では UUID v1 が付与されたほうが嬉しい場合が多そう。

mod_setenvif

リクエストの情報(たとえば User-Agent や Remote_Host)がパターンにマッチするかどうかによって環境変数に値を設定する SetEnvIf などのディレクティブを提供するモジュール。

mod_version

IfVersion セクションによりバージョン依存の設定を入れる。

mod_remoteip

L7LB 配下に Apache がいるとき接続元 IP アドレスが L7LB になってしまう問題の対処として RemoteIPHeader ディレクティブにより指定された X-Forwarded-For などのリクエストヘッダを接続元 IP アドレスと解釈して上書きする機能を提供するモジュール。

mod_proxy

フォワードプロキシ、またはリバースプロキシの機能を提供するモジュール。関連するモジュールが多数ある。

以下はプロキシしたいプロトコルによって必要となるモジュールである。

  • mod_proxy_connect … SSL をトンネリングする場合に必要となる CONNECT メソッドをサポート
  • mod_proxy_ftp
  • mod_proxy_http
  • mod_proxy_fcgi
  • mod_proxy_scgi
  • mod_proxy_uwsgi
  • mod_proxy_fdpass … AF_UNIX domain socket へのプロキシをサポート
  • mod_proxy_wstunnel … WebSocket のトンネリングをサポート
  • mod_proxy_ajpApache JServ Protocol をサポート

以下はそのほかの機能を提供するモジュールである。

  • mod_proxy_balancer … リバースプロキシをロードバランサーとして利用するためのコア機能を提供するモジュール。ロードバランシングのアルゴリズムの実装は別で提供されている
  • mod_proxy_express … DBM ファイルに ServerName とバックエンドの URL を書き込むことにより動的にリバースプロキシを構成するためのモジュール
  • mod_proxy_hcheck … ヘルスチェックの機能を実装したモジュール

mod_session

Apache だけでセッションを実現するモジュール。SessionHeader ディレクティブで指定した名前のリクエストヘッダにバックエンド側で値を設定することでセッションに書き込み、SessionEnv On を設定して HTTP_SESSION 環境変数を読みだすことでセッションを読み出すことができる。

mod_session_cookie を使えばセッションのデータの保存先が Cookie に、mod_session_dbd を使えば mod_dbd に対応しているデータベースが保存先になる。

mod_session_crypto を使えばセッションのデータをシークレットで暗号化できる。SessionHeaderHTTP_SESSION で読み書きされるデータは平文のまま扱える。

mod_slotmem_shm, mod_slotmem_plain

ドキュメントなし。モジュールの開発者向け?

mod_ssl

SSL を有効化するためのモジュール。

mod_optional_hook_export, mod_optional_hook_import, mod_optional_fn_import, mod_optional_fn_export

ドキュメントなし。

mod_dialup

ダイヤルアップモデムに適した帯域制限を設定することができるモジュール。

mod_http2

Apache で HTTP/2 を利用するためのモジュール。HTTP/2 対応については以下のチュートリアルがある。

https://httpd.apache.org/docs/2.4/howto/http2.html

mod_proxy_http2

mod_proxy を HTTP/2 に対応させるモジュール。HTTP/2 over TCP (h2c) も使える。

mod_lbmethod_byrequests, mod_lbmethod_bytraffic, mod_lbmethod_bybusyness, mod_lbmethod_heartbeat

mod_proxy_balancer で利用されるロードバランシングのアルゴリズムの実装を提供するモジュール。

mod_unixd

指定された UserGroup に降格したり ChrootDir で指定したディレクトリに chroot するなどの簡易的なセキュリティ対策を実現するためのモジュール。

mod_heartbeat, mod_heartmonitor

mod_heartbeat が広報したハートビートを mod_heartmonitor で受け取って mod_lbmethod_heartbeat で利用するといった機能を提供するモジュール。

mod_dav

WebDAV を利用するためのモジュール。

mod_status

SetHandler server-status を設定することで Apache の状態を、たとえば処理中のリクエスト数などを出力するエンドポイントを作成できる。

mod_autoindex

公開リポジトリ でよく見かけるようなディレクトリインデックスを表示するためのモジュール。

mod_asis

ファイルの内容をそのまま HTTP のレスポンスとして返す send-as-is ハンドラーを提供する。たとえばファイルの先頭に

Status: 301 Moved Permanently
Location: http://example.com/

のように書いたファイルを設置すれば 301 が返せるようになる。

mod_info

SetHandler server-info を設定することで Apache の情報、たとえばバージョンや利用可能なモジュールを出力するエンドポイントを作成できる。

mod_suexec

SuexecUserGroup ディレクティブにより CGI を実行するときのユーザーとグループを設定できる。

mod_cgi, mod_cgid

cgi-script ハンドラーを設定することで CGI を実行することができるようになるモジュール。mpm_prefork_module 以外を使っているときは mod_cgid を使う必要がある。

mod_dav_fs

mod_dav モジュールのバックエンドとして Apache が動いているファイルシステムを利用するためのモジュール。WebDAV の一番基本的な使い方なので、単に Dav On と指定するだけで Dav filesystem と指定したのと同じことになる。

mod_dav_lock

mod_dev モジュールのバックエンドから利用するためのロックの API を提供するモジュール。

mod_vhost_alias

バーチャルホストに応じて DocumentRootScriptAlias を動的に決定することができるモジュール。それ以外の設定で動的に変更できるのは .htaccess を使って変更できるディレクティブに限られるのが惜しい。

mod_negotiation

HTTP content negotiation、すなわち Accept-Language などのリクエストヘッダに応じて適切なレスポンスを返すことができる仕組みを利用するためのモジュール。

mod_dir

URL にディレクトリ名が指定されたときの挙動をサポートするモジュール。DirectoryIndex ディレクティブの指定により index.html を返したりする機能を含む。

mod_imagemap

見かけることが少ない HTML image map という仕様により画像中の指定された部分にリンクや代替テキストを付与することができる。例としては以下のページを参照。

https://www.w3schools.com/html/html_images_imagemap.asp

このために必要な map ファイルの生成をサポートするモジュール。

mod_actions

特定の条件のリクエストがあったとき、指定した CGI を呼び出すモジュール。Action ディレクティブでは指定した MIME タイプがリクエストされたときに CGI を呼び出す。Script ディレクティブでは指定した HTTP メソッドがリクエストされたときに CGI を呼び出す。

mod_speling

リクエストされたドキュメントは見つからないが、それによく似た名前のドキュメントが見つかった場合に代わりにレスポンスを返す機能を提供するモジュール。大文字小文字の区別と、一文字までの綴りの間違いに対応する。

mod_userdir

しばしば見かける http://example.com/~user/ のリクエストによりユーザーディレクトリを返す機能を提供するモジュール。

mod_alias

Alias, Redirect, ScriptAlias を提供するモジュール。

mod_rewrite

URL の書き換え、すなわち内部リダイレクトを実現するためのモジュール。nginx でいう rewrite である。