TextDrive で lighttpd + FastCGI + Trac
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 で表示されている。 日本時刻に変換する方法を調べないとな。