Slice

概要

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

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

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

他の用途としては、一般的なCSSファイルを使い、サイトの各セクションでその一部のみを使用することです。バイトの範囲のスライスがそのような場合に最も直感的ではないことを認めました。

また、通常のリンクで設定できるという意味では、引数の使用はバイトの範囲よりも便利ですが、バイトの範囲は特別なHTTP ヘッダを必要とします。

設定例:

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

指定された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 に設定し、ファイルの最初の バイトをリクエストすると、ヘッダが提供されません

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

全てのオプションを試す幾つかの例です。

  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. 最初のスライスを除いて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**';
    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を使って何もせずに単にスクラッチからビルドしたいと思うかも知れません。
  • Debianの評価用に開発された最新のNGINXパッケージ(開発版リリースから)が好みであれば、私のdebian NGINX パッケージに興味があるかもしれません。リポジトリを使用し、安定した配布インストールでパッケージを快適に使用するための手順が提供されています

謝辞

tengineをリリースしてくれたJoshua ZhuとTaobaoプラットフォームエンジニアリングチームに感謝します。

ライセンス

Copyright (C) 2010-2012 Alibaba Group Holding Limited

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  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.

inserted by FC2 system