tracで静的ファイルをpythonから分離する

mod_pythonでも効果があったので、trac.cgi経由の場合はもっと顕著に効果が出そう。

  • 直接apache(aliasとtrac.iniのhtdocs設定)で応答した場合
$ ab -c 10 -n 100 http://example.com/tracdocs/css/trac.css | grep 'Requests per sec'
Requests per second:    376.00 [#/sec] (mean)

webサーバのCPUはほとんど使われない。

$ ab -c 10 -n 100 http://example.com/trac/chrome/common/css/trac.css | grep 'Requests per sec'
Requests per second:    111.67 [#/sec] (mean)

webサーバのCPUは100% 近くに張り付く。

設定

tracの設定

trac.iniに設定。
絶対URLで他サーバを指定することも可能。

[trac]
htdocs_location = /tracdocs
webサーバ側の設定

Alias設定するか、symlinkをdocment root以下に設定するか。
自分がpython, trac(setup.py)をソースで入れた場合は、trac本体は

/usr/local/lib/python2.6/site-packages/Trac-0.11.5.ja1-py2.6.egg/trac/

にあった。で、このままでもいいけど、PATHを簡単にするために自分は

ln -s /usr/local/lib/python2.6/site-packages/Trac-0.11.5.ja1-py2.6.egg/trac/ /usr/local/trac

としています。なので

Alias /tracdocs /usr/local/trac/htdocs
<Directory /usr/local/trac/htdocs>
## 必要ならアクセス許可とかを設定
</Directory>	
  • symlinkの場合
ln -s /usr/local/trac/htdocs /path/to/docment_root/tracdocs
webサーバ側で強制的に対処する

trac.iniの編集不要。
複数tracプロジェクトを置くサーバとかで。
(そんなに気にしないでいいかもしれないけど)
各担当者がそれぞれtrac作る場合はtrac.iniにhtdocs_locationを書いてくれないかもしれない。
(書かなかってもアクセスできて正常に表示できるのだから)
(一担当者はサーバのリソースなんか気にしないだろうし)
というわけで性悪説的にtrac.iniの設定なんかしてくれないだろう
でもサーバのリソースは極力無駄に使いたくない
ということを考えて、mod_rewriteで飛ばしてみた。

trac.iniに設定をしていなければ
(TracUriRootが/tracだとすると)
traccssなどへのアクセスは
http://example.com//trac/proj1/chrome/common/trac.ico
http://example.com//trac/proj2/chrome/common/css/trac.css
となるので

Alias /tracdocs /usr/local/trac/htdocs
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/trac/[[:alnum:]]+/chrome/common/
RewriteRule ^/trac/[[:alnum:]]+/chrome/common/(.*) /tracdocs/$1 [L,PT]

で、できた。