Concat

概要

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

モジュールはApacheの modconcatによって着想されました。結合を有効にするために同じパターンに従います。以下のように2つの?を使います:

http://example.com/??style1.css,style2.css,foo/style3.css

3つ目の ? があると、バージョン文字列として扱われます。以下のようになります:

http://example.com/??style1.css,style2.css,foo/style3.css?v=102234

設定例:

location /static/css/ {
    concat on;
    concat_max_files 20;
}

location /static/js/ {
    concat on;
    concat_max_files 30;
}

もともとの説明は António P. P. Almeidaによって書かれました。

ディレクティブ

concat

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

指定されたcontextでファイルを結合することができます。

concat_types

構文:concat_types MIME types
デフォルト:text/css application/x-javascript
コンテキスト:http, server, location

指定されたcontextで結合することができる MIME types を定義します。

concat_unique

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

指定されたMIMEタイプのファイルだけが結合できるか、あるいは幾つかのMIMEタイプが結合できるかを定義します。例えば、offに設定すると、指定されたcontextの中でJavascriptとCSSファイルを結合することができます。

デフォルトの値は onで、指定されたcontextの中で同じMIMEタイプのファイルだけが結合されることを意味します。つまり、CSSおよびJSを持っている場合、以下のようなことをできません:

http://example.com/static/??foo.css,bar/foobaz.js

そうするためには、concat_uniqueoffに設定しなければなりませんconcat_typesを使ってそれぞれのMIMEタイプを追加することで、結合しようと決めたどのような他の種類のファイルへも適用します。

concat_max_files

構文:concat_max_files number
デフォルト:10
コンテキスト:http, server, location

指定されたcontextの中で結合することができる最大の数を定義します。指定されたURIはプラットフォームのページサイズより大きくできないことに注意してください。Linuxでは以下を実行してページサイズを取得することができます:

getconf PAGESIZE

通常は 4k です。つまり、大量のファイルを指定されたcontextに一つにしようとすると、この障害に当たるかも知れません。OSで定義された制限に打ち勝つには、large_client_header_buffers ディレクティブを使わなければなりません。それを必要な値に設定します。

concat_delimiter

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

2つのファイル間のdelimiter を定義します。設定が concat_delimiter "\n"の場合、http://example.com/??1.js,2.jsを訪問すると1.jsと2.jsの間に"\n"が挿入されます。

concat_ignore_file_error

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

404および403を無視するかどうか。

インストール

  • gitリポジトリをクローンする。

    git clone git://github.com/taobao/nginx-http-concat.git
    
  • 以下を追加してbuild設定にモジュールを追加する:

    --add-module=/path/to/nginx-http-concat
    
  • NGINXバイナリをbuildする。

  • NGINXバイナリをインストールする。

  • concatが有効な場所にcontextを設定する。

  • 上の形式のようにリンクを構築します。つまり、結合されるファイルを持つ全てのURLが?? のプリフィックスを持ちます。生成されたHTMLはCSSファイルを結合するために<head> 要素の中でこのようなものを持つでしょう。

    <link rel="stylesheet" href="??foo1.css,foo2.css,subdir/foo3.css?v=2345" />
    

    同じようにJavaScriptファイルは以下のようになるべきです:

    <script src="??bar1.js,bar22.css,subdir/bar3.js?v=3245" />
    
  • これで、firebugのネットワークタブあるいはsafari/chrom/chromimブラウザのインスペクタを開くと、以前はたくさんバーがあった場所に1つのバーが表示されるでしょう。おめでとうございます。これでサーバレベルでファイルの結合を使っています。ファイルを集約するためにスクリプトが邪魔になることはもうありません。しかし、ファイルの 縮小をしないことに注意してください。ですので、それらを結合する前にファイルを縮小したいと思うかも知れません。

  • 以上です。

タグのあるリリース

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

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

  • フッターフィルター

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

  • http スライス

    スライスによってファイルを提供することができます。逆byte-rangeの一種です。ネットワークを占有することなしに大きなファイルを提供するのに便利です。

他のビルド

  1. 冒頭で言及したように、このモジュールはTengine NGINX ディストリビューションの一部です。ですので、公式のNGINXソースの代わりにTengineを使って何もせずに単にスクラッチからビルドしたいと思うかも知れません。
  2. 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. Also for being kind enough to clarify things regarding this module on the NGINX mailing list.

ライセンス

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.