FrontPage  Index  Search  Changes  RSS  Login

[Apache] mod_filter

概要

Apache HTTP Server (以降、Apache) の mod_filter について調べた。

※ 調査対象の Apache のバージョンは 2.2。

フィルタ・モデル

mod_filter は、スマートなフィルタを提供するためのモジュールで、それまでのフィルタとモデルが異なっている。

それまでのフィルタ・モデル

  • ハンドラからクライアントへの単純なチェイン
  • フィルタは AddOutputFilter ファミリを利用して無条件に挿入される
  • 各フィルタを実行するかどうか決定する必要があるが、チェインをダイナミックに構成する柔軟性はほとんどない
    • ハンドラの結果に基づいたダイナミックな構成は問題を引き起こすことがある
  To Client
      ^
      |
+-----------+
|   Filter  |
+-----------+
      |
+-----------+
|   Filter  |
+-----------+
      |
+-----------+
|   Filter  |
+-----------+
      |
+-----------+
|  Handler  |
+-----------+

mod_filter のフィルタ・モデル

  • チェインにフィルタを直接挿入せず、条件付きでプロバイダを割り当てるフィルタ・ハーネスを挿入する
  • コンテント・フィルタは、mod_filter ではプロバイダとして使われる
  • フィルタ・チェインは任意個のフィルタ・ハーネスで構成され、フィルタ・ハーネスは任意個のプロバイダを持つ
                  To Client
                      ^
+----------+          |
| Provider |\ +----------------+ 
+----------+ \|                |   +----------+
              | Filter Harness |---| Provider |
+----------+ /|                |   +----------+
| Provider |/ +----------------+ 
+----------+          |
              +----------------+ 
              |                |   +----------+
              | Filter Harness |---| Provider |
              |                |   +----------+
              +----------------+ 
                      |
                +-----------+
                |  Handler  |
                +-----------+

設定

mod_filter によるフィルタ・チェインの設定は以下の 3 ステージで行う。

フィルタの宣言

FilterDeclare ディレクティブによってフィルタを宣言し、名前とフィルタ・タイプを割り当てる。

プロバイダの登録

FilterProvider ディレクティブでフィルタ・ハーネスにディスパッチ基準を指定してプロバイダを登録する。

チェインの設定

FilterChain ディレクティブでフィルタ・ハーネスを追加/削除などをしてフィルタ・チェインを組み立てる。

SSI

FilterDeclare SSI
FilterProvider SSI INCLUDES resp=Content-Type $text/html
FilterChain SSI 

SSI (2)

FilterProvider SSI INCLUDES Handler server-parsed
FilterChain SSI 

※ 今まで通りのハンドラによるディスパッチ。

deflate

FilterDeclare gzip CONTENT_SET
FilterProvider gzip inflate req=Accept-Encoding !$gzip
FilterChain gzip 

画像のダウンサンプリング

FilterProvider unpack jpeg_unpack Content-Type $image/jpeg
FilterProvider unpack gif_unpack Content-Type $image/gif
FilterProvider unpack png_unpack Content-Type $image/png

FilterProvider downsample downsample_filter Content-Type $image
FilterProtocol downsample "change=yes"

FilterProvider repack jpeg_pack Content-Type $image/jpeg
FilterProvider repack gif_pack Content-Type $image/gif
FilterProvider repack png_pack Content-Type $image/png
<Location /image-filter>
  FilterChain unpack downsample repack
</Location> 

ディレクティブ

拙訳にて。略。

フィルタ・タイプ

フィルタ・タイプは mod_filter 固有のものではないため、mod_filter のドキュメントにはフィルタ・タイプの説明がない。

ap_filter_type について調べればわかる様なので、ソースを調査。

include/util_filter.h
/**
 * Filters have different types/classifications. These are used to group
 * and sort the filters to properly sequence their operation.
 *
 * フィルタは異なるタイプ/分類を持つ。
 * これらはフィルタをまとめ、フィルタの操作が適切な順序となる様に並べるために使われる。
 *
 * The types have a particular sort order, which allows us to insert them
 * into the filter chain in a determistic order. Within a particular grouping,
 * the ordering is equivalent to the order of calls to ap_add_*_filter().
 *
 * タイプは固有の並び順序を持ち、フィルタ・チェインの順序を決められる。
 * グルーピングの内部では、順序づけはap_add_*_filter() を呼び出す順序の事と等価。
 *
 */
typedef enum {
    /** These filters are used to alter the content that is passed through
     *  them. Examples are SSI or PHP.
     *
     *  こられのフィルタはフィルタを通るコンテントを変えるために使われる。
     *  例えば、SSI や PHP。
     *
     */
    AP_FTYPE_RESOURCE     = 10,
    /** These filters are used to alter the content as a whole, but after all
     *  AP_FTYPE_RESOURCE filters are executed.  These filters should not
     *  change the content-type.  An example is deflate.
     *
     *  これらのフィルタは、すべての AP_FTYPE_RESOURCE フィルタが実行された後に、
     *  全体としてコンテントを変えるために使われる。
     *  これらのフィルタは content-type を変えるべきではない。
     *  例えば、deflate。
     *
     */
    AP_FTYPE_CONTENT_SET  = 20,
    /** These filters are used to handle the protocol between server and
     *  client.  Examples are HTTP and POP.
     *
     *  これらのフィルタは、サーバとクライアントの間のプロトコルハンドラとして使われる。
     *  例えば、HTTP と POP。
     *
     */
    AP_FTYPE_PROTOCOL     = 30,
    /** These filters implement transport encodings (e.g., chunking).
     *
     * これらのフィルタはトランスポート・エンコーディングを実行する(e.g., chunking)。
     *
     */
    AP_FTYPE_TRANSCODE    = 40,
    /** These filters will alter the content, but in ways that are
     *  more strongly associated with the connection.  Examples are
     *  splitting an HTTP connection into multiple requests and
     *  buffering HTTP responses across multiple requests.
     *
     *  これらのフィルタは、コネクションとの関係が強固な方法で、
     *  コンテントを変えるために使われる。
     *  例えば、ひとつの HTTP 接続を複数のリクエストに分割したり、
     *  複数のリクエストの HTTP レスポンスをバッファリングするなど。
     *
     *  It is important to note that these types of filters are not
     *  allowed in a sub-request. A sub-request's output can certainly
     *  be filtered by ::AP_FTYPE_RESOURCE filters, but all of the "final
     *  processing" is determined by the main request.
     *
     *  重要な注意として、これらのフィルタのタイプはサブリクエストには許可されない事がある。
     *  サブリクエストの出力は必ず、 ::AP_FTYPE_RESOURCE のフィルタによってフィルタされるが、
     *  "最終的な処理"のすべてはメインリクエストによって判断される。
     *
     */
    AP_FTYPE_CONNECTION  = 50,
    /** These filters don't alter the content.  They are responsible for
     *  sending/receiving data to/from the client.
     *
     *  これらのフィルタはコンテントを変えない。
     *  クライアントから/へのデータを送る/受け取る事に責任を持つ。
     *
     */
    AP_FTYPE_NETWORK     = 60
} ap_filter_type;
Last modified:2010/02/20 19:53:56
Keyword(s):[Apache]
References: