TextDrive で lighttpd + FastCGI + Trac
2006-10-22
TextDrive で Trac を動かす話。眠いので簡潔に書こう。
これまでは、さくらインターネットで Trac を動かしていたけど、 CGI 経由で起動するので若干レスポンスが遅かった。 FastCGI が使える TextDrive で動かすことで、少しは速くなるかも。
構成
TextDrive では Apache 経由で lighttpd に接続し、そこから FastCGI で trac を起動する構成になる。 Rails を動かす時も同じような構成になるみたい。
Apache (http://www.example.com/trac/)
↓ HTTP (Proxy)
lighttpd (http://www.example.com:8765/trac/)
↓ FastCGI
trac.fcgi
trac のインストール
TextDrive には初めから trac がインストールされている。 でも、日本語版が使いたかったので、インタアクト社の日本語版を個別にインストールした。
$ cd ~/src
$ wget http://www.i-act.co.jp/project/products/downloads/trac-0.9.6-ja-2.zip
$ unzip trac-0.9.6-ja-2.zip
$ cd trac-0.9.6-ja-2
$ ./setup.py install --prefix=$HOME
Trac のプロジェクトは ~/var/trac に作る。 さくらに作っていたプロジェクトを rsync を使ってコピーした。
lighttpd のセットアップ
RoR Wiki 翻訳 Wiki - TxD/Installing a Rails Application at TextDrive が参考になる。 サポートに依頼をして lighttpd 用のポートを割り当ててもらい、 lighttpd をセットアップした。 ユーザごとに独自の lighttpd プロセスを起動するのか。太っ腹というか大胆と言うか。
lighttpd の設定ファイルは以下の2つ。
~/etc/lighttpd/lighttpd.conf (共通設定)
~/etc/lighttpd/vhosts.d/trac.conf (trac 起動のための個別設定)
lighttpd.conf の末尾に、 trac.conf のインクルード命令を書いておく。
include "vhosts.d/trac.conf"
Trac のドキュメントを参考にして、 trac.conf に FastCGI の設定を記述する。
fastcgi.server =
( "/trac" =>
( "trac" =>
( "socket" => base + "/var/run/trac-fastcgi.sock",
"bin-path" => base + "/share/trac/cgi-bin/trac.fcgi",
"max-procs" => 1,
"check-local" => "disable",
"bin-environment" =>
( "TRAC_ENV_PARENT_DIR" => base + "/var/trac",
"PYTHONPATH" => base + "/lib/python2.4:" + base + "/lib/python2.4/site-packages",
)
)
)
)
自分のホームディレクトリに Trac をインストールしているので、環境変数 PYTHONPATH を使ってホームディレクトリの lib/python2.4 を参照するようにしている。
Digest 認証
この状態で http://www.example.com:8765/trac/ にアクセスすれば trac のプロジェクト一覧が表示される。 今のままではログインができないので、 lighttpd の trac.conf に認証の設定を追加する。
auth.backend = "htdigest"
auth.backend.htdigest.userfile = base + "/etc/lighttpd/lighttpd.user.htdigest"
auth.require = (
"/trac/note/login" => (
"method" => "digest",
"realm" => "trac",
"require" => "valid-user"
),
"/trac/tdiary_plugin/login" => (
"method" => "digest",
"realm" => "trac",
"require" => "valid-user"
),
)
プロジェクトごとに認証の設定を書いている。 ワイルドカードでの指定が出来ると楽なんだろうけど、方法が分からなかった。
htdigest コマンドを使って lighttpd.user.htdigest を作っておく。
Apache のプロキシ設定
http://www.example.com/trac/ にアクセスがあると、 http://www.example.com:8765/trac/ へプロキシするように Apache を設定する。 TextDrive Help Desk - 3.20. Proxy /trac to tracd on Apache を参考にした。
$ vi web/public/trac/.htaccess
RewriteEngine On
RewriteRule ^(.*) http://www.example.com:8765/trac/$1 [P]
ログイン後のリダイレクト対応 (ProxyPreserveHost)
これで、 http://www.example.com/trac/ にアクセスすると trac の画面が表示されるようになった。 でも、何故か「ログイン」を選択すると、 http://www.example.com:8765/trac/ に飛ばされてしまう。 Firefox の LiveHTTP headers を使って、ログイン直後の HTTP レスポンスを見てみた。
HTTP/1.x 302 Found
Date: Sat, 21 Oct 2006 21:50:52 GMT
Server: Lighttpd | TextDriven
Location: http://www.example.com:8165/trac/note/timeline
(以下省略)
Location にポート番号が含まれているのが原因か。 Location を生成しているのは lighttpd 。 lighttpd は自身の URL が www.example.com:8165 だと認識している(Apache 経由でアクセスされていることは認識していない)ので、こうなるのは当然か。
Apache 側でポート番号を含まないように変換させる。 TextDrive Help Desk - 10.6. Setting up a Proxy to your Rails Applicationを参考にして、 Webmin の Proxying を開き、 Preserve original Host: header を Yes にした。 Apache の実際のディレクティブには、 ProxyPreserveHost が設定された。
ProxyPreserveHost on
これで、 Location のポート番号を Apache が外してくれるようになる。
おしまい
FastCGI で動いているので、若干レスポンスは早くなった…かな? ネットワークが遠い分で、結局トントンかもしれない。
http://www.machu.jp/trac/tdiary_plugin/ # さくら版 (Apache + CGI)
http://textdrive.machu.jp/trac/tdiary_plugin/ # TextDrive版 (lighttpd + FastCGI)
(近いうちにリンク先は変わると思うので pre で)
そういえば、時刻がすべて GMT で表示されている。 日本時刻に変換する方法を調べないとな。