Apache の標準モジュールを(だいたい)全部調べてみた
Docker イメージ httpd:2.4.38
の httpd.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
認証認可で共用のモジュールもある。それぞれ LDAP と FastCGI バックエンドに認証認可を委譲する。
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_username
と httpd_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_ajp … Apache 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 を使えばセッションのデータをシークレットで暗号化できる。SessionHeader
や HTTP_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
指定された User
や Group
に降格したり 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
バーチャルホストに応じて DocumentRoot
と ScriptAlias
を動的に決定することができるモジュール。それ以外の設定で動的に変更できるのは .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
である。