at posts/single.html

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

追記

調べた。TextDrive のタイムゾーン設定 - まちゅダイアリー (2006-10-25)

関連する日記