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. Debianの評価用に開発された最新のNGINXパッケージ(開発版リリースから)が好みであれば、私のdebian NGINX パッケージに興味があるかもしれません。リポジトリを使用し、安定した配布インストールでパッケージを快適に使用するための手順が提供されています

謝辞

TengineをリリースしてくれたJoshua ZhuとTaobaoプラットフォームエンジニアリングチームに感謝します。また、NGINXメーリングリストでこのモジュールに関する事柄を明確にしてくれました。

ライセンス

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