Changes between Initial Version and Version 1 of TracModWSGI


Ignore:
Timestamp:
May 13, 2012, 9:15:45 PM (12 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracModWSGI

    v1 v1  
     1= Trac と mod_wsgi = #Tracandmod_wsgi
     2
     3'''重要な Note:''' ''バージョン 1.6 または 2.4 以降の `mod_wsgi` を使用してください。 2.X ブランチの 2.4 以前のバージョンでは、 Apache の特定の設定下において WSGI の file_wrapper 拡張の扱いに問題があります。この拡張は Trac では添付ファイルおよび、スタイルシートなどの静的メディアファイルを提供する箇所で使われています。この問題の影響を受けてしまった場合、添付ファイルは空ファイルとして扱われてしまい、 HTML ページではスタイルシートがロードされないため描画が正しく行われなくなります。詳細は mod_wsgi のチケット [http://code.google.com/p/modwsgi/issues/detail?id=100 #100] と [http://code.google.com/p/modwsgi/issues/detail?id=132 #132] を確認してください。
     4
     5[http://code.google.com/p/modwsgi/ mod_wsgi] は WSGI 互換の Python アプリケーションを Apache 上で直接起動させることができる Apache のモジュールです。 mod_wsgi アダプターは完全に C 言語で書かれており、 mod_python や CGI に比べて非常によいパフォーマンスを提供します。
     6
     7Trac は mod_wsgi のトップレベルに application を定義するスクリプトだけで動作します。このスクリプトは単独の Python ファイルで、通常は .wsgi という拡張子で保存されます。このファイルを生成するためには '''trac-admin <env> deploy <dir>''' コマンドを使用します。コマンドを実行すると必要となるパスが自動的に設定されます。
     8
     9{{{
     10#!python
     11import os
     12
     13os.environ['TRAC_ENV'] = '/usr/local/trac/mysite'
     14os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     15
     16import trac.web.main
     17application = trac.web.main.dispatch_request
     18}}}
     19
     20環境変数 `TRAC_ENV` は通常通り Trac environment のディレクトリを指定します (複数の Trac environment を含むディレクトリであれば `TRAC_ENV_PARENT_DIR` を使うこともできます)。 `PYTHON_EGG_CACHE` は Python eggs を一時的に展開するのに使用するディレクトリを指定します。
     21
     22'''重要な Note:''' 複数の `.wsgi` ファイルを使用する場合 (それぞれのファイルに別個の Trac environment を設定するケースなど) は、 `os.environ['TRAC_ENV']` には Trac environment のパスを ''設定しない'' でください。この方法を使うと、別の Trac environment の設定が Trac にロードされてしまうことがあります。 (以前にロードした Trac environment のパスが使われてしまいます。) この問題は `.wsgi` ファイルの内容を下記の通り変更することで回避できます:
     23
     24{{{
     25#!python
     26import os
     27
     28os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     29
     30import trac.web.main
     31def application(environ, start_response):
     32  environ['trac.env_path'] = '/usr/local/trac/mysite'
     33  return trac.web.main.dispatch_request(environ, start_response)
     34}}}
     35
     36分かりやすくするために、このファイルの拡張子は `.wsgi` とすべきです。 Apache にアクセス権を開放できるのであれば、このファイルは自分が所有権を持つディレクトリに置くこともできます。この .wsgi ファイルは TracAdmin のコマンド `deploy` を使用することで作成することができます。
     37
     38Trac と egg ファイルをインストールしたパスが通常と異なる場合、それらのパスを以下の要領で wsgi スクリプトの先頭に記述する必要があります:
     39
     40{{{
     41#!python
     42import site
     43site.addsitedir('/usr/local/trac/lib/python2.4/site-packages')
     44}}}
     45
     46パスはインストールした Trac のライブラリに位置に一致するように変更してください。
     47
     48wsgi-script の準備ができたら、以下のように httpd.conf に設定を追加してください。
     49
     50{{{
     51WSGIScriptAlias /trac /usr/local/trac/mysite/apache/mysite.wsgi
     52
     53<Directory /usr/local/trac/mysite/apache>
     54    WSGIApplicationGroup %{GLOBAL}
     55    Order deny,allow
     56    Allow from all
     57</Directory>
     58}}}
     59
     60Trac environment のサブディレクトリにスクリプトがある場合、 Apache がスクリプトを起動する為には、スクリプトが含まれるディレクトリまで完全に Apache がアクセスできなければなりません。 {{{WSGIApplicationGroup}}} ディレクティブを使用すると、常に mod_wsgi が作成した最初の Python インタプリタ内で Trac が起動することが保証されます; これは Trac で使用している Subversion の Python バインディングがサブインタプリタでは動作しないことがあるため必要になります。リクエストがハングし、 Apache がクラッシュしたような結果が返ります。この設定を行った後は Apache を再起動しないと反映されません。
     61
     62Apache, mod_wsgi, Python 本体 (Trac とその依存ライブラリを除く) の設定をテストしたい場合、簡単な wsgi アプリケーションを使用するとリクエストが処理されているか確認することができます (以下に示す内容だけを持つ .wsgi スクリプトを使用してください):
     63
     64{{{
     65def application(environ, start_response):
     66        start_response('200 OK',[('Content-type','text/html')])
     67        return ['<html><body>Hello World!</body></html>']
     68}}}
     69
     70mod_wsgi の [http://code.google.com/p/modwsgi/wiki/IntegrationWithTrac インストール例] に Trac の情報が掲載されています。
     71
     72トラブルシューティングの Tips は [TracModPython#Troubleshooting mod_python のトラブルシューティング] セクションも参考になります。 Apache に関連する問題の多くは似通っていて、多くの場合 mod_wsgi を使用する [http://code.google.com/p/modwsgi/wiki/ApplicationIssues アプリケーション側の問題] です。
     73
     74''Note: 私の環境では mod_wsgi 2.5 と Python 2.6.1 を使うと Internal Server Error が発生しました (Apache 2.2.11 および Trac 0.11.2.1)。 Python 2.6.2 にアップグレードすると解決しました。 ([http://www.mail-archive.com/modwsgi@googlegroups.com/msg01917.html ここ] に書いてある通り)[[BR]]-- Graham Shanks''
     75
     76== mod_wsgi 使用におけるTrac での Apache 基本認証 == #ApacheBasicAuthenticationforTracthrumod_wsgi
     77
     78上記の mod_wsgi のドキュメントには、 Apache の設定例 a) trac をバーチャルホストでサブドメインを作成して動かす例と b) Trac の認証として、 Apache の基本認証を設定する例が記載されています。
     79
     80
     81例えば、 trac を !http://trac.my-proj.my-site.org としてホストし、{{{/home/trac-for-my-proj}}} フォルダから起動する場合で、 {{{the-env}}} を作成するために、 {{{trac-admin the-env initenv}}} コマンドを使用し、 {{{the-deploy}}} フォルダを作成するために、 {{{trac-admin the-env deploy the-deploy}}} コマンドを使用した場合です:
     82
     83htpasswd ファイルを作成します:
     84{{{
     85cd /home/trac-for-my-proj/the-env
     86htpasswd -c htpasswd firstuser
     87### and add more users to it as needed:
     88htpasswd htpasswd seconduser
     89}}}
     90( セキュリティ面より、このファイルはドキュメントルートにおきます)
     91
     92以下の設定を含んだファイルを作成します。例 {{{/etc/apache2/sites-enabled/trac.my-proj.my-site.org.conf}}} (ubuntu):
     93
     94{{{
     95<Directory /home/trac-for-my-proj/the-deploy/cgi-bin/trac.wsgi>
     96  WSGIApplicationGroup %{GLOBAL}
     97  Order deny,allow
     98  Allow from all
     99</Directory>
     100
     101<VirtualHost *:80>
     102  ServerName trac.my-proj.my-site.org
     103  DocumentRoot /home/trac-for-my-proj/the-env/htdocs/
     104  WSGIScriptAlias / /home/trac-for-my-proj/the-deploy/cgi-bin/trac.wsgi
     105  <Location '/'>
     106    AuthType Basic
     107    AuthName "Trac"
     108    AuthUserFile /home/trac-for-my-proj/the-env/htpasswd
     109    Require valid-user
     110  </Location>
     111</VirtualHost>
     112
     113}}}
     114
     115
     116(サブドメインが適切に動くにようにするには、 /etc/hosts ファイルの変更や、ホストサーバの DNS の A レコードにサブドメインを追加する必要があります)
     117
     118== Trac と PostgreSQL == #TracwithPostgreSQL
     119
     120mod_wsgi アダプタを使用し、 Trac のインスタンスを複数ホストしている場合に、 PostgreSQL (もしかすると MySQL も?) をデータベースバックエンドとして使用していると、大量のデータベース接続が生成され (PostgreSQL のプロセスも大量に発生し) てしまいます。
     121
     122さしあたり動く解決方法として、 Trac が持つコネクションプールを無効化する方法があります。これは trac.db.postgres_backend の PostgreSQLConnection クラスで定義されている poolable を False に設定することで適用できます。
     123
     124この方法を適用するために、 Trac のソースを変更する必要はありません。以下に示す行を trac.wsgi に追加してください:
     125
     126{{{
     127import trac.db.postgres_backend
     128trac.db.postgres_backend.PostgreSQLConnection.poolable = False
     129}}}
     130
     131この設定で Trac ページを生成した後にコネクションを捨てるようになり、データベースへの接続数は最小に保たれます。
     132
     133== SSPI および 'Require Group' 使用時に Trac を動かす方法 == #GettingTractoworknicelywithSSPIandRequireGroup
     134Trac を Win32 上の Apache で起動し、 SSPI 設定して 'Require group' オプションを構成している場合、 'SSPIOmitDomain' オプションはおそらく動作しません。 Trac にユーザ名が認識されない場合は、 'user' が 'DOMAIN\user' のように見えている可能性があります。
     135
     136このような場合、以下のように WSGI スクリプトを修正すると解決すると思います:
     137{{{
     138import os
     139import trac.web.main
     140
     141os.environ['TRAC_ENV'] = '/usr/local/trac/mysite'
     142os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     143
     144def application(environ, start_response):
     145    if "\\" in environ['REMOTE_USER']:
     146        environ['REMOTE_USER'] = environ['REMOTE_USER'].split("\\", 1)[1]
     147    return trac.web.main.dispatch_request(environ, start_response)
     148}}}
     149----
     150See also:  TracGuide, TracInstall, [wiki:TracFastCgi FastCGI], [wiki:TracModPython ModPython], [http://trac.edgewall.org/wiki/TracNginxRecipe TracNginxRecipe]