■ Trac を設置するときは静的ファイルを分離すると速い

Trac のマニュアル (TracCgi) に書いてあることだけど、意外と知らない人がいそうなのでメモ。 特に、レンタルサーバに CGI として設置する場合には重要なポイント。

デフォルト状態の問題

Trac をデフォルトの状態で動かすと、 Trac のロゴやスタイルシートや JavaScript ファイルが、みんな Trac プログラム経由でのアクセスとなる。 例えば、 Trac を CGI として

http://www.example.jp/trac.cgi

に設置したとすると、 Trac のロゴは

http://www.example.jp/trac.cgi/chrome/common/trac_logo_mini.png

という URL になる。 Firebug などで見れば分かるけど、すべて CGI を経由するので負荷がかかってレスポンスが遅くなる。

対策…静的ファイルの分離

静的ファイルを Web サーバから直接参照できる場所に置くことで、負荷を大きく下げることができる。 Trac の静的ファイルは、ソースから入れた場合は

/opt/local/share/trac/htdocs

に入っている。 ディレクトリは環境によって /usr/local/share だったり、 $HOME/share だったりする。 setup.py を使った場合は

/opt/local/lib/python2.5/site-packages/Trac-0.11b1-py2.5.egg/trac/htdocs

あたりに入ってる（うちの MacBook Pro の場合）。

このディレクトリを、 Web サーバの DocumentRoot 以下からシンボリックリンクを張って参照できるようにする。

$ cd /var/www $ ln -s $TRAC_HTDOCS trac_common

※ TRAC_HTDOCS は前述の htdocs ディレクトリの場所に読み替えて

次に、 trac.ini を編集して Trac にこの静的ファイルの場所を教えてあげる。 [trac] セクションの htdocs_location に指定する。

[trac] htdocs_location = /trac_common

こうすれば、先ほどのロゴの URL は

http://www.example.jp/trac_common/trac_logo_mini.png

になる。 こうすれば画像やスタイルシートの読み込み時に CGI が起動されなくなる。

ちなみに

僕は Subversion が使えて自由度の効く TextDrive に Trac を設置しているけど、海外にサーバがあるので遅延が大きい。 なので、静的ファイルだけを国内の別サーバから取得するようにしている。 さっきの例で言うと、 Trac 本体が

http://www.example.jp/trac.cgi

とすると、静的ファイルは、

http://static.example.jp/trac_common/trac_logo_mini.png

という感じ。 trac.ini にも以下のように書いている。

[trac] htdocs_location = http://static.example.jp/trac_common

レンタルサーバの場合は体感的にわかるほどの違いがあるので、ぜひやってみるといいよ。