tracの高速化

[id:orangehat:20080419]のエントリのままではCSSJavascriptファイルのような静的ファイルもCGI経由で取得してしまう。
そのせいで、tracの表示が異常に遅くなっているとのこと。
でもイマイチCGIをわからず使っているので今回でちょっと学習してみる。

CGIとは?

CGIって何の略?

Common Gateway Interfaceの略らしいです。
で、なんでそれが使えるのかというと、ApacheCGI機能が標準搭載されているからだそうです。

CGIでできること

本来のWEBサーバの本分は、要求されたページをブラウザに出力することにあるかと思います。
逆に言うと、要求されたページしか出力できない。
CGIを使うとまあPHPRUBYみたいな双方向のやり取りが「お手軽」にできるということらしいですね。

実際の仕組み

今回CGIを調べて一番知りたかったのはここなのですが、余り詳しい情報がなく中途半端になってしまった感が否めないですが、一応調べたこと。

普通のHTMLを要求された時、WEBサーバは先ほど言ったとおり要求されたHTMLファイルを出力します。
しかしCGIファイルの場合は、WEBサーバでCGIスクリプトが実行され、その実行結果がブラウザに出力されます。
POSTやGETの値によって、出力する実行結果を変えることによって、動的にファイルの生成ができたりするわけです。

実際には、たとえばGETで渡された値はWEBサーバを通じて、QUERY_STRINGという環境変数に格納されます。
その環境変数の値が(標準入力として)、CGIプログラムに渡され実行されるというわけです。

tracであれば、http://example.com/trac/wiki/TracGuideというURLにアクセスしたとする。
すると、まず/trac/wiki/TracGuideというURIを右から左に向かって解析してファイル名(CGIとは限らない)を探す。
そして、見つかったファイル名の右側にある要素、つまり今回であれば、/wiki/TracGuideが環境変数PATH_INFOとしてCGIプログラムに渡される。
そのPATH_INFOの値によってif文なんかで出力するファイルを変えている感じでしょうか。
と、まあ実際に読んだわけではなく、チラ見した限りではところどころPATH_INFOを使っているのでそうかな、と。
間違っていたらご指摘いただければ幸いです。

まあ、上のような実際にWEBサーバでスクリプトが実行される分、遅くなるということです。

静的ファイルはCGIを経由しないで取得する

さて、本来の目的であったtracの高速化です。
ちなみに実際に何もしていない状態でLive HTTP headersで見てみると、
http://example.com/trac/chrome/common/css/trac.css
というようにtrac.cgiを経由して取得しています。

$HOME/local/share/htdocs配下にCSSファイルやJavascriptファイル、画像ファイルなどがあります。
これらのファイルをDocumentRoot以下に置くためにシンボリックリンクを貼ってやります。
んでもって、trac.iniに静的ファイルはここから取得すべし、と指定してやります。

$ cd $HOME/www
$ ln -s $HOME/local/share/trac/htdocs/ trac_common
$ vi $HOME/svn/trac/conf/trac.ini

------------------------------------------------------
[trac]
.....
htdocs_location = /trac_common
.....
------------------------------------------------------

こうすることによって、静的ファイルはCGIを経由せずに取得されるわけです。
実際に先ほどと同じファイルは、
http://example.com/trac_common/css/trac.css
というようにtrac.cgiを経由せずに取得されるようになります。
そんなに変わるもんかね、とか思っていたんですが劇的に早くなったのでお勧めです。