= Trac と mod_python = #Tracandmod_python
[[TracGuideToc]]
Trac では [http://www.modpython.org/ mod_python] を利用可能です。 [http://www.modpython.org/ mod_python] は Trac のレスポンスタイムを飛躍的に向上し、特に [TracCgi CGI] と比べて、 [wiki:TracStandalone tracd]/mod_proxy では使用できない多くの Apache 機能を使えるようにします。
以下の説明は Apache2 のためのものです; まだ Apache1.3 を使用しているなら、 [http://trac.edgewall.org/wiki/TracModPython2.7 TracModPython2.7] にいくつか情報があります。
== シンプルなコンフィグレーション == #Simpleconfiguration
mod_python をインストールしたら、 Apache の設定ファイルに以下の一行を追加してモジュールをロードしなければなりません:
{{{
LoadModule python_module modules/mod_python.so
}}}
''Note: モジュールがインストールされている正しいパスは HTTPD をどこにインストールしたかによって変わります。''
Debian で apt-get を使用する場合
{{{
apt-get install libapache2-mod-python libapache2-mod-python-doc
}}}
(Debian の続き) mod_python をインストールした後に、apache2 (上の Load Module に相当するもの) のモジュールを有効にしなければなりません :
{{{
a2enmod mod_python
}}}
Fedora で yum を使用する場合:
{{{
yum install mod_python
}}}
httpd.conf に以下を加えることで、 mod_python がインストールされたかテストすることができます。セキュリティ上の理由から、テストが終わった時点で以下のコンフィグは削除するべきです。 Note: mod_python.testhandler は mod_python 3.2+ で利用可能です。
{{{
#!xml
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler mod_python.testhandler
}}}
mod_python を使用した簡単な Trac のセットアップ方法は以下のようになります:
{{{
#!xml
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /var/trac/myproject
PythonOption TracUriRoot /projects/myproject
}}}
'''`TracUriRoot`''' オプションは不要な場合もあります。 `TracUriRoot` オプションを付けずに試し、 Trac が正しく URL を生成できないか、 "No handler matched request to..." というエラーが出るようであれば '''`TracUriRoot`''' を追加して下さい。 `Location` と '''`TracUriRoot`''' が同じパスになるようにしてください。
!PythonOption の一覧は以下の通りです。
{{{
# For a single project
PythonOption TracEnv /var/trac/myproject
# For multiple projects
PythonOption TracEnvParentDir /var/trac/myprojects
# For the index of multiple projects
PythonOption TracEnvIndexTemplate /srv/www/htdocs/trac/project_list_template.html
# A space delimitted list, with a "," between key and value pairs.
PythonOption TracTemplateVars key1,val1 key2,val2
# Useful to get the date in the wanted order
PythonOption TracLocale en_GB.UTF8
# See description above
PythonOption TracUriRoot /projects/myproject
}}}
=== Python Egg Cache === #PythonEggCache
Genshi のように圧縮された Python egg は通常、実行するユーザのホームディレクトリ配下の `.python-eggs` ディレクトリに展開されます。 Apache のホームディレクトリは多くの場合、書き込みできないようになっているので、他のディレクトリを egg cache として指定しなければなりません:
{{{
PythonOption PYTHON_EGG_CACHE /var/trac/myprojects/egg-cache
}}}
=== 認証設定 === #ConfiguringAuthentication
パスワードファイルを作成して、認証を構成するには [wiki:TracCgi#AddingAuthentication CGI] と同じように行います。
{{{
#!xml
AuthType Basic
AuthName "myproject"
AuthUserFile /var/trac/myproject/.htpasswd
Require valid-user
}}}
Apache の mod_ldap 認証のコンフィグは少し扱いにくいです。(httpd 2.2.x と OpenLDAP: slapd 2.3.19)
1. Apache の httpd.conf に以下のモジュールをロードする必要があります
{{{
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
}}}
2. httpd.conf は以下のような感じになります:
{{{
#!xml
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/trac/
PythonOption TracUriRoot /trac/
Order deny,allow
Deny from all
Allow from 192.168.11.0/24
AuthType Basic
AuthName "Trac"
AuthBasicProvider "ldap"
AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=co,dc=ke?uid?sub?(objectClass=inetOrgPerson)"
authzldapauthoritative Off
require valid-user
}}}
Microsoft Active Directory の LDAP インタフェースを使用する場合:
{{{
#!xml
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/trac/
PythonOption TracUriRoot /trac/
Order deny,allow
Deny from all
Allow from 192.168.11.0/24
AuthType Basic
AuthName "Trac"
AuthBasicProvider "ldap"
AuthLDAPURL "ldap://adserver.company.com:3268/DC=company,DC=com?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN ldap-auth-user@company.com
AuthLDAPBindPassword "the_password"
authzldapauthoritative Off
# require valid-user
require ldap-group CN=Trac Users,CN=Users,DC=company,DC=com
}}}
Note 1: このケースでは LDAP 検索で複数の OU をまとめて取得するために、 AD のグローバルカタログサーバ (Global Catalog Server) に接続しています (ポート番号が通常 LDAP で使用される 389 ではなく 3268 であることに注意してください) 。 GCS は基本的に "平らな" ツリーであり、ユーザが、どの OU に属するか不明な場合でも検索することができます。
Note 2: Active Directory は、レコードにアクセスするために user/password (AuthLDAPBindDN と AuthLDAPBindPassword) による認証を必要とします。 (訳注: GC ではなく、通常の LDAP であれば Active Directory の ACL に認証なしユーザからの読み取り許可を設定すれば不要です)
Note 3: "require ldap-group ..." ディレクティブはメンバのアクセスが許可されている AD のグループを指定します。
=== !PythonPath を設定する === #SettingthePythonPath
もし Trac のインストールが、通常の Python ライブラリのパスの中に無い場合、 Apache が Trac の mod_python ハンドラを見つけられるように `PythonPath` ディレクティブで指定しなければなりません:
{{{
#!xml
...
PythonPath "sys.path + ['/path/to/trac']"
...
}}}
!PythonPath ディレクティブを使用するときは気をつけてください。そして、 `SetEnv PYTHONPATH` は動かないので ''使用しない'' で下さい。
== マルチプロジェクトのセットアップ == #Settingupmultipleprojects
Trac の mod_python ハンドラには Subversion の `SvnParentPath` とよく似た `TracEnvParentDir` というコンフィグレーションオプションがあります。
{{{
#!xml
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/trac
PythonOption TracUriRoot /projects
}}}
`/projects` の URL をリクエストすると、 TracEnvironment の親ディレクトリ `TracEnvParentDir` として設定したディレクトリ配下のサブディレクトリ一覧が表示されます。その一覧から何かプロジェクトを選択するとそれに該当する TracEnvironment を開くことができます。
あなたのプロジェクトのホームページとして、サブディレクトリのリストが必要ないならば、以下のようにすることができます
{{{
#!xml
}}}
これは !DocumentRoot フォルダの直下にカスタムホームページとして配置されていない場合には、すべてのロケーションで代わりに mod_python を使用することを Apache に教えます。
すべてのプロジェクトに対して、 `` ディレクティブを使用することによって同じ認証の仕組みを使用することができます。
{{{
#!xml
AuthType Basic
AuthName "Trac"
AuthUserFile /var/trac/.htpasswd
Require valid-user
}}}
== 仮想ホストの設定 == #VirtualHostConfiguration
以下に示す例は Trac を仮想サーバーとしてセットアップするときに必要な設定です。 (例えば、!http://trac.mycompany.com といった
URL でアクセスすることができます):
{{{
#!xml
DocumentRoot /var/www/myproject
ServerName trac.mycompany.com
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /var/trac/myproject
PythonOption TracUriRoot /
AuthType Basic
AuthName "MyCompany Trac Server"
AuthUserFile /var/trac/myproject/.htpasswd
Require valid-user
}}}
この設定は全てのケースでうまく動くわけではありません。動かない場合は以下を試してください:
* `` の代わりに `` を使用する。
* はサーバの設定によっては、単にサーバのルートではなく完全なホスト名を参照していることがあります。このような場合、 (上記の例では下段にあたるログイン用ディレクトリを含む) 全てのリクエストが Python に送信され、認証が動かなくなります (認証を行おうとすると、認証が設定されていないというエラー画面が表示されます)。 URL を変更できるのであれば (/, /login の代わりに /web/, /web/login などのように) ルートではなくサブディレクトリを使ってみてください。
複数のプロジェクトをサポートする仮想ホストの設定では、 "`TracEnv`" /var/trac/myproject を "`TracEnvParentDir`" /var/trac/ に置き換えて下さい。
Note: !DocumentRoot は TracEnvironment と同じディレクトリにしないでください。 何かのバグがあった場合に TracEnvironment の内容が外部からアクセス可能になってしまうおそれがあります。
== トラブルシューティング == #Troubleshooting
サーバエラーのページがでたときには、 まずは Apache のエラーログを確認するか、 `PythonDebug` オプションを有効にして下さい:
{{{
#!xml
...
PythonDebug on
}}}
複数プロジェクトの場合は、全てのプロジェクトでサーバを再起動してみてください。
=== Expat-related のセグメンテーションフォルト === #expat
この問題は Unix 上で Python 2.4 を使用するとき、ほぼ確実に発生します。
Python 2.4 の使用する Expat (C で書かれた XML パーザライブラリ) と Apache の使用する Expat のバージョンが異なる場合に、セグメンテーションフォルトが発生します。
Trac 0.11 は Genshi (間接的に Expat が使用される) を使用しているため、以前 Trac 0.10 で正常に動いていたとしても、現在のあなたの環境で問題が起こり得ます。
Graham Dumpleton が、この問題について詳しく書いています。問題の [http://www.dscpl.com.au/wiki/ModPython/Articles/ExpatCausingApacheCrash 説明と回避方法] を確認してください。
=== フォームを送信するときの問題 === #Formsubmissionproblems
もし、 Trac で何かしらのフォームを送信したときに、トラブルに見舞われたら (送信後にスタートページにリダイレクトされてしまう、などがよくある問題です) {{{DocumentRoot}}} の中に mod_python をマッピングしたパスと同じフォルダやファイルが存在しないか確認してください。どういうわけか、 mod_python は静的リソースと同じところにマッピングされると混乱してしまいます。
=== 仮想ホストの設定においての問題 === #Problemwithvirtualhostconfiguration
ディレクティブが使用されている場合に `DocumentRoot` を設定すると ''403 (Forbidden)'' エラーになることがあります。 `DocumentRoot` ディレクティブを削除するか、アクセスが許されているディレクトリに設定されているかどうかを確認して下さい (対応する `` ブロックにて)
で `SetHandler` を使用すると、すべてを mod_python でハンドルすることになりますが、いかなる CSS も image/icons もダウン