Slice

概要

このモジュールはNGINXのディストリビューションである Tengine と一緒に配布されており、eコマース/オークションサイトTaobao.comで使われています。このディストリビューションはNGINXの舞台では新しい幾つかのモジュールを含みます。ngx_http_slice_module モジュールはそのうちの一つです。

このモジュールは逆バイト範囲リクエストヘッダと考えることができます。その場でgzip圧縮を使いながら、NGINXが大きなファイルを小さな部分(バイト範囲)にスライスできるための主要なユーティリティです。

代表的な例は、帯域の利用を最小限にしながら大きなファイルをダウンロードすることができるようにすることです。これは各リンクがファイルの幅によって分割されたファイルの異なる領域を示すリンクによってファイルが販売されるための道具としても使われるかも知れません。

Other use would be to use a generic CSS file and use only part of it for each section of a site. Granted that byte-range slicing isn’t the most intuitive for such.

Note also that using arguments is more useful than byte-ranges in the sense that they can be set in a normal link, while byte ranges require a special HTTP header.

設定例:

location ^~ /video-dump/ {
    slice; # enable slicing
    slice_start_arg s;
    slice_end_arg e;
}

つまり、以下のようにファイルの最初の1kをリクエストします:

http://example.com/video-dump/large_vid.mp4?s=0&e=1024

注意

s=0, start at 0 and e=1024, stop at 1024 bytes (1k).

このドキュメントはもともとAntónio P. P. Almeidaによって書かれました。

ディレクティブ

slice

構文:スライス
デフォルト:none
コンテキスト:場所

指定されたlocationでのコンテントのスライスを有効にします。

slice_arg_begin

構文:slice_arg_begin string
デフォルト:start
コンテキスト:http, server, location

バイトのstartの領域のリクエストを定義する引数を定義します。

slice_arg_end

構文:slice_arg_end string
デフォルト:end
コンテキスト:http, server, location

バイトのendの領域のリクエストを定義する引数を定義します。

slice_header

構文:slice_header string
デフォルト:none
コンテキスト:http, server, location

NGINXによって提供される各スライスのheaderとして使用される文字列を定義します。

slice_header_first

構文:slice_header_first [on|off]
デフォルト:on
コンテキスト:http, server, location

off に設定し、ファイルの最初の バイトをリクエストすると、ヘッダが提供されません

このディレクティブは残りのスライスから最初のスライスを区別するために特に有用です。最初のスライスはヘッダを持たないものです。

Here’re some examples that explore all the options.

  1. 最初のスライスを除いてheaderを送信している大きなDBファイルを提供します
location ^~ /dbdumps/ {
    slice; # enable slicing
    slice_start_arg first;
    slice_end_arg last;
    slice_header '-- **db-slice-start**';
    slice_header_first off;
}

そして、リクエストはこのようになります:

http://example.com/dbdumps/somedb.sql?first=0&last=1048576

最初の1Mを送信し、*-- **db-slice-start*** ヘッダーをスキップします。

  1. 最初のスライスを除いてheaderを送信している大きなDBファイルを提供します
location ^~ /dbdumps/ {
    slice; # enable slicing
    slice_start_arg first;
    slice_end_arg last;
    slice_header '-- **db-slice-start**';
    slice_header_first off;
    slice_footer '-- **db-slice-end**';
}

フッターを送信するという意味で以前とは異なります。

  1. Serve a huge DB file while sending headers except on the first slice and send footer except on the last slice
location ^~ /dbdumps/ {
    slice; # enable slicing
    slice_start_arg first;
    slice_end_arg last;
    slice_header '-- **db-slice-start**';
    slice_header_first off;
    slice_footer '-- **db-slice-end**';
    slice_footer_last off;
}

そして、リクエストはこのようになります:

http://example.com/dbdumps/somedb.sql?first=0&last=1048576

最初の1Mを送信し、*-- **db-slice-start*** ヘッダーをスキップします。

ファイルが200MBの場合、以下を使って最後のスライスを取得します:

http://example.com/dbdumps/somedb.sql?first=208666624&last=209715200

この最後のスライスはフッターを持ちません。

インストール

  1. gitリポジトリをクローンする。git clone git://github.com/taobao/nginx-http-slice.git
  2. 以下を追加してbuild設定にモジュールを追加する:
--add-module=/path/to/nginx-http-slice
  1. NGINXバイナリをbuildする。
  2. NGINXバイナリをインストールする。
  3. concatが有効な場所にcontextを設定する。
  4. 上の形式のようなリンクを構築します。つまり特定の幅に対応する全てのURIです。例として、これはファイルの最初の4kにリンクする方法です:
<a href="http://example.com/datadumps/dump0.sql?start=0&end=4096"/>db dump</a>
  1. 以上です。

タグのあるリリース

Tengineのリリースと同期して各リリースをタグ付けします。

Github上のほかのtengineモジュール

  • http concat

    指定されたファイルのセットを結合しサーバから1つの応答を発送することができます。CSSおよびJavascriptファイルを集約するのに特に便利です。

  • フッターフィルター

    リクエストボディの最後にいくつかの特別なデータ(markupあるいは無し)を追加することができます。アプリケーションを調整する必要無しにタイムスタンプあるいは他の様々なものを追加するなどする場合に実用的です。

他のビルド

  • 冒頭で言及したように、このモジュールは*Tengine* NGINX ディストリビューションの一部です。ですので、公式のNGINXソースの代わりにtengineを使って何もせずに単にスクラッチからビルドしたいと思うかも知れません。
  • If you fancy a bleeding edge NGINX package (from the dev releases) for Debian made to measure then you might be interested in my debian NGINX package. Instructions for using the repository and making the package live happily inside a stable distribution installation are provided.

謝辞

Thanks to Joshua Zhu and the Taobao platform engineering team for releasing tengine.

ライセンス

Copyright (C) 2010-2012 Alibaba Group Holding Limited

修正の如何に関係なくソースおよびバイナリ形式での再配布および使用は以下の条件に合う限り許可されます:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

TOP
inserted by FC2 system