Trac と mod_python

Trac では mod_python を利用可能です。 mod_python は Trac のレスポンスタイムを飛躍的に向上し、特に CGI と比べて、 tracd/mod_proxy では使用できない多くの Apache 機能を使えるようにします。

シンプルなコンフィグレーション

もし mod_python をインストールしたならば、 Apache の設定ファイルに以下の一行を追加してモジュールをロードしなければなりません:

LoadModule python_module modules/mod_python.so

Note: モジュールがインストールされている正しいパスは HTTPD をどこにインストールしたかによって変わります。

httpd.conf に以下の記述を追加してmod_python が正しくインストールされているかどうかを確かめることができます。セキュリティ上の理由で、この記述はテストが終了したら削除すべきです。

<Location /mpinfo>
   SetHandler mod_python
   PythonHandler mod_python.testhandler
</Location>

mod_python を使用した簡単な Trac のセットアップ方法は以下のようになります:

<Location /projects/myproject>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnv /var/trac/myproject
   PythonOption TracUriRoot /projects/myproject
</Location>

TracUriRoot オプションは不要な場合もあります。 TracUriRoot オプションを付けずに試し、 Trac が正しく URL を生成できないようであれば TracUriRoot を追加して下さい。 LocationTracUriRoot が同じパスになることに気づくでしょう。

認証設定

認証の設定は CGI と同じです:

<Location "/projects/myproject/login">
  AuthType Basic
  AuthName "myproject"
  AuthUserFile /var/trac/myproject/.htpasswd
  Require valid-user
</Location>

PythonPath を設定する

もし Trac のインストールが、通常の Python ライブラリのパスの中に無い場合、 Apache が Trac の mod_python ハンドルを見つけられるように PythonPath ディレクティブで指定しなければなりません:

<Location /projects/myproject>
  ...
  PythonPath "sys.path + ['/path/to/trac']"
  ...
</Location>

PythonPath ディレクティブを使用するときは気をつけてください。そして、 SetEnv PYTHONPATH は動かないので使用しないで下さい。

マルチプロジェクトのセットアップ

Trac の mod_python ハンドラには Subversion の SvnParentPath とよく似た TracEnvParentDir というコンフィグレーションオプションがあります。

<Location /projects>
  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend 
  PythonOption TracEnvParentDir /var/trac
  PythonOption TracUriRoot /projects
</Location>

/projects の URL をリクエストすると、 TracEnvironment の親ディレクトリ TracEnvParentDir として設定したディレクトリ配下のサブディレクトリ一覧が表示されます。その一覧から何かプロジェクトを選択するとそれに該当する TracEnvironment を開くことができます。

あなたのプロジェクトのホームページとして、サブディレクトリのリストが必要ないならば、以下のようにすることができます。

<LocationMatch "/.+/">

これは Apache に mod_python を使用するために DocumentRoot フォルダの代わりのロケーションを使用することを教えます。

すべてのプロジェクトに対して、 <LocationMatch> ディレクティブを使用することによって同じ認証の仕組みを使用することができます。

<LocationMatch "/projects/[^/]+/login">
  AuthType Basic
  AuthName "Trac"
  AuthUserFile /var/trac/.htpasswd
  Require valid-user
</LocationMatch>

仮想ホストの設定

以下に示す例は Trac を仮想サーバーとしてセットアップするときに必要な設定です。 (例えば、http://trac.mycompany.com といった URL でアクセスすることができます):

<VirtualHost * >
    DocumentRoot /var/trac/myproject
    ServerName trac.mycompany.com
    <Location />
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend
        PythonOption TracEnv /var/trac/myproject
        PythonOption TracUriRoot /
    </Location>
    <Location /login>
        AuthType Basic
        AuthName "MyCompany Trac Server"
        AuthUserFile /var/trac/myproject/.htpasswd
        Require valid-user
    </Location>
</VirtualHost>

複数のプロジェクトをサポートする仮想ホストの設定では、 "TracEnv" /var/trac/myproject を "TracEnvParentDir" /var/trac/ に置き換えて下さい。

トラブルシューティング

サーバエラーのページがでたときには、 まずはApache のエラーログを確認するか、 PythonDebug オプションを有効にして下さい:

<Location /projects/myproject>
  ...
  PythonDebug on
</Location>

フォームを送信するときの問題

もし、 Trac で何かしらのフォームを送信したときに、トラブルに見舞われたら(よくある問題として、送信後にスタートページにリダイレクトされてしまうという問題があります)、 DocumentRoot の中に mod_python をマッピングしたパスと同じフォルダやファイルが存在しないか確認してください。どういうわけか、 mod_python は静的リソースと同じところにマッピングされると混乱してしまいます。

仮想ホストの設定においての問題

もし <Location /> ディレクティブが使用されているとき、 DocumentRoot を設定すると 403 (Forbidden) エラーになるでしょう。 DocumentRoot ディレクティブを削除するか、アクセスが許されているディレクトリに設定されているかどうかを確認して下さい (対応する <Directory> ブロックにて)

<Location /> で SetHandler を使用すると、すべてを mod_python でハンドルすることになりますが、いかなる CSS も image/icons もダウンロードできなくなります。この問題を回避するために、 <Location /trac> で SetHandler None を使用しています。しかし、この方法がエレガントな解決方法だとは思っていません。

.htaccess ファイルを使用する

ディレクトリの設定をほんのちょっと修正するには .htaccess ファイルを使用すればいいかもしれませんが、これは動作しません。 Apache が Trac URL に "/" (スラッシュ) を追加すると、正しい動作を妨げてしまいます。

それでは、 mod_rewrite を使用すればいいように見えますが、これも動作しません。とにかく、百害あって一理なしです。指示に従ってください。:)

Win32 での特記

Windows 上で mod_python 3.2 より前のバージョンで Trac を動かしている場合、 添付ファイルのアップロードが 動かない でしょう。この問題は 3.1.4 以降で解決されました。 mod_python をアップグレードしてこの問題を解決してください。

OS X での特記

OS X で mod_python を使用するとき、 apachectl restart コマンドで Apache の再起動ができないでしょう。これは、 mod_python 3.2 でおそらく修正されるでしょう。しかし、 ここ にあるパッチを適用すれば、 3.2 以前のバージョンでもこの問題を回避できます。

SELinux での特記

もし、 Trac が Cannot get shared lock on db.lock というようなメッセージが出力されたら、 リポジトリに セキュリティコンテキストを設定する必要があるでしょう:

chcon -R -h -t httpd_sys_content_t PATH_TO_REPOSITORY

See also [http://subversion.tigris.org/faq.html#reposperms]

FreeBSD での特記

mod_python と sqlite パッケージのインストールバージョンに注意して下さい。 Ports には両パッケージともいろいろなバージョンがありますが、初期の pysqlite と mod_python は組み合わせることができません。前者は python のスレッド機能サポートが必要ですし、 後者 は python のスレッド機能なしのインストールが必要です。

Subversion での特記

Trac でコマンドライン、 TracStandalone で使用しているときは動くのに、 mod_python を使用しているときのみ、 Unsupported version control system "svn" というエラーが出力される場合、 [TracModPython#PythonPathを設定する PythonPath?] ディレクティブに Python bindings へのパスを追加するのを忘れている可能性があります。 (Python の site-packages ディレクトリに Python binding へのパスをはるか、 .pth ファイルを作っておくのがベターです。)

これに当てはまらない場合、使用している Subversion のライブラリが Apache が使用しているバージョンと適合性がないかもしれません。(たいてい apr ライブラリの不適合性が原因になります。)その場合、 Apache の svn モジュール (mod_dav_svn) も使用できないでしょう。


See also: TracGuide, TracInstall, TracCgi, TracFastCgi

track feed