読者です 読者をやめる 読者になる 読者になる

mod_concat で複数ファイルを連結して配信する

apache

先日リリースした某サービスの HTML を見ていたら、外部 js ファイルの読み込みに が十数行ずらずらと並んでいるのを発見。
これ、確か Apache module でまとめて配信してくれるのがあったよなあ……とブクマを掘り起こして、mod_concat を見つけたので試してみた。
ソースコードのコメントに

* The Idea was initially thought of by David Davis in Vox, and reimplemented in perlbal.

とあるように、もともとは Perlbal が持っている機能を Apache module にしたもの。

svn からチェックアウトして apxs でコンパイル & インストール。

$ svn checkout http://modconcat.googlecode.com/svn/trunk/ modconcat-read-only
# apxs -i -c modconcat-read-only/mod_concat/mod_concat.c

httpd.conf に設定。

LoadModule concat_module     modules/mod_concat.so

これで path/to/??FILE1,FILE2,FILE3 のように呼んでやると、カンマで区切られたファイルがすべて連結されて出力される。"??" が、mod_concat で配信する合図。

実際の効果を Firebug でみるとこんな感じ。

concat なし

15リクエストで 201 ms.

concat あり

2リクエストで 41 ms.

あとは開発用に、Catalyst::Plugin::Static::Simple でこの記法を処理する機能が必要かも。
TT で対処もできるけど。

[% files = ['file1', 'file2', 'file3'] %]
[% IF c.config.use_mod_concat %]
  <script src="[% c.uri_for('static') %]/??[% files.join(',') %]"></script>
[% ELSE %]
  [% FOR f IN files %]
  <script src="[% c.uri_for('static', f) %]"></script>
  [% END %]
[% END %]