= 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 もダウン