Changes between Initial Version and Version 1 of TracModWSGI


Ignore:
Timestamp:
Apr 10, 2015, 1:03:53 PM (10 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracModWSGI

    v1 v1  
     1= Trac と mod_wsgi = #Tracandmod_wsgi
     2
     3
     4[http://code.google.com/p/modwsgi/ mod_wsgi] は WSGI 互換の Python アプリケーションを Apache 上で直接起動させることができる Apache のモジュールです。 mod_wsgi アダプターは完全に C 言語で書かれており、すばらしいパフォーマンスを提供します。
     5
     6[[PageOutline(2-3,Overview,inline)]]
     7
     8== `trac.wsgi` スクリプト == #trac.wsgiscript
     9
     10Trac は以下に記すスクリプトによって mod_wsgi のトップで実行されます。これらスクリプトは単なる Python ファイルで、通常は `.wsgi` という拡張子で保存されます。
     11
     12=== 基本的なスクリプト === #Averybasicscript
     13もっともシンプルな形式:
     14
     15{{{#!python
     16import os
     17
     18os.environ['TRAC_ENV'] = '/usr/local/trac/mysite'
     19os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     20
     21import trac.web.main
     22application = trac.web.main.dispatch_request
     23}}}
     24
     25環境変数 `TRAC_ENV` は通常通り Trac environment のディレクトリを指定します (複数の Trac environment を含むディレクトリであれば `TRAC_ENV_PARENT_DIR` を使うこともできます)。 `PYTHON_EGG_CACHE` は Python eggs を一時的に展開するのに使用するディレクトリを指定します。
     26
     27=== 複雑なスクリプト === #Amoreelaboratescript
     28
     29複数の `.wsgi` ファイルを使用する場合 (それぞれのファイルに別個の Trac environment を設定するケースなど) は、 `os.environ['TRAC_ENV']` に Trac environment のパスを ''設定しない'' でください。この方法を使うと、別の Trac environment のコンテンツが読み込まれたり、直前に表示した Trac environment のパスが使われてしまうことがあります。
     30
     31この問題は `.wsgi` ファイルの内容を下記の通り変更することで回避できます:
     32{{{#!python
     33import os
     34
     35os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     36
     37import trac.web.main
     38def application(environ, start_response):
     39  environ['trac.env_path'] = '/usr/local/trac/mysite'
     40  return trac.web.main.dispatch_request(environ, start_response)
     41}}}
     42
     43分かりやすくするために、このファイルの拡張子は `.wsgi` とすべきです。 Apache にアクセス権を開放できるのであれば、このファイルは自分が所有権を持つディレクトリに置くこともできます。
     44
     45Trac と egg ファイルをインストールしたパスが通常と異なる場合、それらのパスを以下の要領で wsgi スクリプトの先頭に記述する必要があります:
     46
     47{{{#!python
     48import site
     49site.addsitedir('/usr/local/trac/lib/python2.4/site-packages')
     50}}}
     51
     52パスはインストールした Trac のライブラリに一致するように変更してください。
     53
     54=== 推奨される `trac.wsgi` スクリプト === #Recommendedtrac.wsgiscript
     55
     56比較的堅牢で汎用的なファイルを生成するためには `trac-admin <env> deploy <dir>` コマンドを使用します。コマンドを実行すると必要となるパスが自動的に設定されます (TracInstall#cgi-bin 参照) 。
     57
     58
     59== スクリプトのリクエストをマッピングする == #Mappingrequeststothescript
     60
     61.wsgi スクリプトを作成したら、Apache の設定ファイル (例えば `httpd.conf`) に以下を追記してください。
     62
     63{{{
     64WSGIScriptAlias /trac /usr/local/trac/mysite/apache/mysite.wsgi
     65
     66<Directory /usr/local/trac/mysite/apache>
     67    WSGIApplicationGroup %{GLOBAL}
     68    Order deny,allow
     69    Allow from all
     70</Directory>
     71}}}
     72
     73スクリプトは Trac environment のサブディレクトリにあります。
     74
     75[trac:TracInstall#cgi-bin Trac cgi-bin ディレクトリを生成する] のならば、Apache の設定ファイルには以下のように記述してください:
     76
     77{{{
     78WSGIScriptAlias /trac /usr/share/trac/cgi-bin/trac.wsgi
     79
     80<Directory /usr/share/trac/cgi-bin>
     81    WSGIApplicationGroup %{GLOBAL}
     82    Order deny,allow
     83    Allow from all
     84</Directory>
     85}}}
     86
     87Apache がスクリプトを起動する為には、スクリプトが含まれるディレクトリまで完全に Apache がアクセスできなければなりません。 `WSGIApplicationGroup` ディレクティブを使用すると、常に mod_wsgi が作成した最初の Python インタプリタ内で Trac が起動することが保証されます。これは Trac で使用している Subversion の Python バインディングがサブインタプリタでは動作しないことがあるため必要になります。リクエストがハングし、 Apache がクラッシュしたような結果が返ります。この設定を行った後は Apache を再起動しないと反映されません。
     88
     89Apache, mod_wsgi, Python 本体 (Trac とその依存ライブラリを除く) の設定をテストしたい場合、簡単な wsgi アプリケーションを使用するとリクエストが処理されているか確認することができます (以下に示す内容だけを持つ `.wsgi` スクリプトを使用してください):
     90
     91{{{#!python
     92def application(environ, start_response):
     93        start_response('200 OK',[('Content-type','text/html')])
     94        return ['<html><body>Hello World!</body></html>']
     95}}}
     96
     97mod_wsgi の特定ディレクティブの使用方法についての詳細は、 [http://code.google.com/p/modwsgi/wiki/ mod_wsgi's wiki] または [http://code.google.com/p/modwsgi/wiki/IntegrationWithTrac インストール例] を参照してください。
     98
     99
     100== 認証の設定 == #ConfiguringAuthentication
     101
     102このセクション内では認証の設定方法をいくつか記述します。
     103
     104Apache ガイドの [http://httpd.apache.org/docs/2.2/howto/auth.html 認証、許可、アクセスコントロール] も参照してください。
     105
     106=== 基本認証 === #UsingBasicAuthentication
     107
     108Apache で認証を追加する最も簡単な方法は、パスワードファイルを作成することです。 `htpasswd` プログラムを使用してパスワードファイルを作成します:
     109{{{
     110$ htpasswd -c /somewhere/trac.htpasswd admin
     111New password: <type password>
     112Re-type new password: <type password again>
     113Adding password for user admin
     114}}}
     115
     116一番最初のユーザ以外は "-c" オプションは必要ありません:
     117{{{
     118$ htpasswd /somewhere/trac.htpasswd john
     119New password: <type password>
     120Re-type new password: <type password again>
     121Adding password for user john
     122}}}
     123
     124  '' `htpasswd` についての詳細は man を参照してください。''
     125
     126ユーザを作成した後、TracPermissions の記述通りユーザに権限を設定することができます。
     127
     128Apache の設定ファイルの中にパスワードファイルを記述し、認証を有効にする必要があります:
     129{{{
     130<Location "/trac/login">
     131  AuthType Basic
     132  AuthName "Trac"
     133  AuthUserFile /somewhere/trac.htpasswd
     134  Require valid-user
     135</Location>
     136}}}
     137
     138複数のプロジェクトを持っている場合でも、共通のパスワードファイルを使用することができます:
     139{{{
     140<LocationMatch "/trac/[^/]+/login">
     141  AuthType Basic
     142  AuthName "Trac"
     143  AuthUserFile /somewhere/trac.htpasswd
     144  Require valid-user
     145</LocationMatch>
     146}}}
     147Note: 'login'  という名のファイルやディレクトリが必要なわけではありません。[[BR]]
     148[http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html mod_auth_basic] も参照してください。
     149
     150=== ダイジェスト認証 === #UsingDigestAuthentication
     151
     152セキュリティ強化のために、SSL を有効にするか、少なくとも "基本認証" の代わりに "ダイジェスト認証" を使用することを推奨します。
     153
     154以下のように、`htpasswd` の代わりに `htdigest` コマンドを使用して `.htpasswd` ファイルを作成してください:
     155{{{
     156# htdigest -c /somewhere/trac.htpasswd trac admin
     157}}}
     158
     159上記の "trac" パラメータは "realm" です。Apache の設定ファイルの !AuthName ディレクティブで再度指定してください:
     160
     161{{{
     162<Location "/trac/login">
     163
     164    AuthType Digest
     165    AuthName "trac"
     166    AuthDigestDomain /trac
     167    AuthUserFile /somewhere/trac.htpasswd
     168    Require valid-user
     169</Location>
     170}}}
     171
     172複数の environment を持っている場合、上記に記述した方法で、同じ `LocationMatch` を使用することができます。
     173
     174必ず mod_auth_digest をアクティブにしてください。 Debian 4.0r1 (etch) の例:
     175{{{
     176    LoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so
     177}}}
     178
     179
     180[http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html mod_auth_digest] も参照してください。
     181
     182=== LDAP 認証 === #UsingLDAPAuthentication
     183
     184Apache の [http://httpd.apache.org/docs/2.2/mod/mod_ldap.html mod_ldap] 認証の設定ファイルは少し扱いにくいです。(httpd 2.2.x  OpenLDAP: slapd 2.3.19)
     185
     1861. Apache の httpd.conf に以下のモジュールをロードする必要があります
     187{{{
     188LoadModule ldap_module modules/mod_ldap.so
     189LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
     190}}}
     191
     1922. httpd.conf は以下のようになります:
     193
     194{{{
     195<Location /trac/>
     196  # (if you're using it, mod_python specific settings go here)
     197  Order deny,allow
     198  Deny from all
     199  Allow from 192.168.11.0/24
     200  AuthType Basic
     201  AuthName "Trac"
     202  AuthBasicProvider "ldap"
     203  AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=co,dc=ke?uid?sub?(objectClass=inetOrgPerson)"
     204  authzldapauthoritative Off
     205  Require valid-user
     206</Location>
     207}}}
     208
     209
     2103. Microsoft Active Directory の LDAP インターフェースを使用することもできます:
     211
     212
     213以下を LDAP URL に使用します:
     214{{{
     215    AuthLDAPURL "ldap://directory.example.com:3268/DC=example,DC=com?sAMAccountName?sub?(objectClass=user)"
     216}}}
     217
     218認証情報をチェックするために Apache にアカウントを提供する必要があります。
     219このパスワードは設定ファイル内のプレーンテキストにリストアップされるので、
     220このタスク専用のアカウントを使用すべきです:
     221{{{
     222    AuthLDAPBindDN ldap-auth-user@example.com
     223    AuthLDAPBindPassword "password"
     224}}}
     225
     226セクション全体はこのようになります:
     227{{{
     228<Location /trac/>
     229  # (if you're using it, mod_python specific settings go here)
     230  Order deny,allow
     231  Deny from all
     232  Allow from 192.168.11.0/24
     233  AuthType Basic
     234  AuthName "Trac"
     235  AuthBasicProvider "ldap"
     236  AuthLDAPURL "ldap://adserver.company.com:3268/DC=company,DC=com?sAMAccountName?sub?(objectClass=user)"
     237  AuthLDAPBindDN       ldap-auth-user@company.com
     238  AuthLDAPBindPassword "the_password"
     239  authzldapauthoritative Off
     240  # require valid-user
     241  require ldap-group CN=Trac Users,CN=Users,DC=company,DC=com
     242</Location>
     243}}}
     244
     245Note 1: このケースでは LDAP 検索で複数の OU をまとめて取得するために、 AD のグローバルカタログサーバ (Global Catalog Server) に接続しています (ポート番号が通常 LDAP で使用される 389 ではなく 3268 であることに注意してください) 。 GCS は基本的に "平らな" ツリーであり、ユーザが、どの OU に属するか不明な場合でも検索することができます。
     246
     247Note 2: 有効なログインを持っているかの代わりに、
     248LDAP グループに所属しているかを要求することができます:
     249{{{
     250    Require ldap-group CN=Trac Users,CN=Users,DC=example,DC=com
     251}}}
     252
     253関連ページ:
     254  - [http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html mod_authnz_ldap],  mod_authnz_ldap に関するドキュメンテーション
     255
     256 - [http://httpd.apache.org/docs/2.2/mod/mod_ldap.html mod_ldap], mod_ldap に関するドキュメンテーション。コネクションプールや共有のキャッシュを提供します
     257 - [http://trac-hacks.org/wiki/LdapPlugin TracHacks:LdapPlugin], LDAP の TracPermissions を格納するプラグイン
     258
     259=== SSPI 認証 === #UsingSSPIAuthentication
     260
     261Windows 上で Apache を使用しているのであれば、シングルサインオン機能を提供する mod_auth_sspi を使用することができます。
     262!SourceForge の [http://sourceforge.net/projects/mod-auth-sspi/ mod-auth-sspi プロジェクト] からモジュールをダウンロードし、
     263バーチャルホストに以下を追記してください。
     264{{{
     265    <Location /trac/login>
     266        AuthType SSPI
     267        AuthName "Trac Login"
     268        SSPIAuth On
     269        SSPIAuthoritative On
     270        SSPIDomain MyLocalDomain
     271        SSPIOfferBasic On
     272        SSPIOmitDomain Off
     273        SSPIBasicPreferred On
     274        Require valid-user
     275    </Location>
     276}}}
     277
     278SSPI 認証を使用すると、Trac のユーザ名が `DOMAIN\username` という形式になるので、
     279パーミッションなどを追加しなおす必要があります。ユーザ名にドメインを入れたくない場合は、
     280`SSPIOmitDomain On` と代わりに設定してください。
     281
     282SSPI 認証に関する共通の問題: [trac:#1055 本家チケット 1055], [trac:#1168 本家チケット 1168], [trac:#3338 本家チケット 3338] 。
     283
     284[trac:TracOnWindows/Advanced] も参照してください。
     285
     286=== !AccountManagerPlugin のログインフォームを使用した Apache 認証 === #UsingApacheauthenticationwiththeAccountManagerplugin'sLoginform
     287
     288まず、!AccountManagerPlugin の [http://trac-hacks.org/wiki/AccountManagerPlugin/Modules#LoginModule Login モジュール] と [http://trac-hacks.org/wiki/AccountManagerPlugin/AuthStores#HttpAuthStore HttpAuthStore authentication モジュール] の基本的な仕様を参照してください。
     289
     290'''Note:''' acct_mgr-0.4 より前のバージョンの !AccountManager を使用していると、WSGI で !HttpAuthStore を動かすことは難しいです。アップグレードを推奨します。
     291
     292単一のプロジェクトに acct_mgr-0.4 を使用した例:
     293{{{
     294[components]
     295; be sure to enable the component
     296acct_mgr.http.HttpAuthStore = enabled
     297
     298[account-manager]
     299; configure the plugin to use a page that is secured with http authentication
     300authentication_url = /authFile
     301password_store = HttpAuthStore
     302}}}
     303Apache の設定ファイルはこのようになります:
     304{{{
     305<Location /authFile>
     306   …HTTP authentication configuration…
     307   Require valid-user
     308</Location>
     309}}}
     310'''authFile''' が存在する必要はありません。前述の !HttpAuthStore へのリンク先から、複数の Trac プロジェクトをサーバー上でホスティングした場合を説明する箇所などを参照してください。
     311
     312=== 例: バーチャルホストのルートが Trac である Apache/mod_wsgi 基本認証 === #Example:Apache/mod_wsgiwithBasicAuthentication,Trac beingattherootofavirtual host
     313
     314上記の mod_wsgi のドキュメントには、 Apache の設定例 a) Trac のインスタンスをバーチャルホストでサブドメインを作成して動かす例と b) Trac の認証として、 Apache の基本認証を設定する例が記載されています。
     315
     316
     317例えば、 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` コマンドを使用した場合です:
     318
     319htpasswd ファイルを作成します:
     320{{{
     321cd /home/trac-for-my-proj/the-env
     322htpasswd -c htpasswd firstuser
     323### and add more users to it as needed:
     324htpasswd htpasswd seconduser
     325}}}
     326(セキュリティのため、このファイルはドキュメントルートにおきます)
     327
     328以下の設定を含んだファイルを作成します。例 `/etc/apache2/sites-enabled/trac.my-proj.my-site.org.conf` (ubuntu):
     329
     330{{{
     331<Directory /home/trac-for-my-proj/the-deploy/cgi-bin/trac.wsgi>
     332  WSGIApplicationGroup %{GLOBAL}
     333  Order deny,allow
     334  Allow from all
     335</Directory>
     336
     337<VirtualHost *:80>
     338  ServerName trac.my-proj.my-site.org
     339  DocumentRoot /home/trac-for-my-proj/the-env/htdocs/
     340  WSGIScriptAlias / /home/trac-for-my-proj/the-deploy/cgi-bin/trac.wsgi
     341  <Location '/'>
     342    AuthType Basic
     343    AuthName "Trac"
     344    AuthUserFile /home/trac-for-my-proj/the-env/htpasswd
     345    Require valid-user
     346  </Location>
     347</VirtualHost>
     348
     349}}}
     350
     351Note: サブドメインが適切に動くにようにするには、 /etc/hosts ファイルの変更や、ホストサーバの DNS の A レコードにサブドメインを追加する必要があります。
     352
     353
     354== トラブルシューティング == #Troubleshooting
     355
     356=== 最新バージョンを使う === #Usearecentversion
     357
     358`mod_wsgi` のバージョンは 1.6 か 2.4 かそれより新しいものを使用してください。2.4 以前のバージョン 2.X のブランチは WSGI ファイルラッパー拡張機能を使用する Apache の設定にいくつか問題があります。この拡張機能は Trac 内でスタイルシートのような添付ファイルや静的メディアファイルを提供するのに使用します。この問題の影響を受けると、添付ファイルは何もないように見えてしまったり、スタイルシートがうまくロードできなくなることで HTML ページのフォーマットが機能していないように見えてしまったりします。他に 2 進数の添付ファイルが省略されてしまうといった問題も頻繁に起こります。mod_wsgi に関するチケット [http://code.google.com/p/modwsgi/issues/detail?id=100 #100] と [http://code.google.com/p/modwsgi/issues/detail?id=132 #132] を参照してください。
     359
     360''Note: mod_wsgi 2.5 と Python 2.6.1 を使用していると、システム上 (Apache 2.2.11 と Trac 0.11.2.1) で Internal Server Error が発生しました。Python 2.6.2 にアップグレードすることで([http://www.mail-archive.com/modwsgi@googlegroups.com/msg01917.html こちら] で勧められています) 私の場合は解決しました。[[BR]]-- Graham Shanks''
     361
     362もし 'mod_wsgi' を Windows の組み込みモードでの使用や Linux 上で MPM worker と併用することを予定している場合, バージョン 0.3.4 以上が必要です。 (詳細については、 [trac:#10675] を参照してください)
     363
     364=== SSPI および 'Require Group' 使用時に Trac を動かす方法 === #GettingTractoworknicelywithSSPIandRequireGroup
     365Trac を Win32 上の Apache で起動し、 SSPI 設定して 'Require group' オプションを構成している場合、 'SSPIOmitDomain' オプションはおそらく動作しません。 Trac にユーザ名が認識されない場合は、 'user' が 'DOMAIN\user' のように見えている可能性があります。
     366
     367このような場合、以下のように WSGI スクリプトを修正すると解決すると思います:
     368{{{#!python
     369import os
     370import trac.web.main
     371
     372os.environ['TRAC_ENV'] = '/usr/local/trac/mysite'
     373os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'
     374
     375def application(environ, start_response):
     376    if "\\" in environ['REMOTE_USER']:
     377        environ['REMOTE_USER'] = environ['REMOTE_USER'].split("\\", 1)[1]
     378    return trac.web.main.dispatch_request(environ, start_response)
     379}}}
     380
     381
     382=== Trac と PostgreSQL === #TracwithPostgreSQL
     383
     384mod_wsgi アダプタを使用し、 Trac のインスタンスを複数ホストしている場合に、 PostgreSQL (もしかすると MySQL も?)をデータベースバックエンドとして使用していると、大量のデータベース接続が生成され、PostgreSQL のプロセスも大量に発生してしまう''かも''しれません。
     385
     386荒々しい方法ですが解決策として、Trac が持つコネクションプールを無効化する方法があります。これは `trac.db.postgres_backend` の `PostgreSQLConnection` クラスに `poolable = False` と設定することで適用できます。
     387
     388この方法を適用するために、 Trac のソースを変更する必要はありません。以下に示す行を `trac.wsgi` に追加してください:
     389
     390{{{
     391import trac.db.postgres_backend
     392trac.db.postgres_backend.PostgreSQLConnection.poolable = False
     393}}}
     394
     395または
     396
     397{{{
     398import trac.db.mysql_backend
     399trac.db.mysql_backend.MySQLConnection.poolable = False
     400}}}
     401
     402この設定で Trac ページを生成した後にコネクションを捨てるようになり、データベースへの接続数は最小に保たれます。
     403
     404//この方法は推奨されたものではありません。[http://code.google.com/p/modwsgi/wiki/IntegrationWithTrac mod_wsgi の IntegrationWithTrac] ページの最後も参照してください。//
     405
     406=== その他の資料 === #Otherresources
     407
     408[TracModPython#Troubleshooting mod_python のトラブルシューティング] セクションも参照してください。 Apache に関連する問題の多くは似通っていて、多くの場合 mod_wsgi を使用する [http://code.google.com/p/modwsgi/wiki/ApplicationIssues アプリケーション側の問題] です。 wsgi ページにも [http://code.google.com/p/modwsgi/wiki/IntegrationWithTrac Integration With Trac] ドキュメントがあります。
     409
     410
     411----
     412See also:  TracGuide, TracInstall, [wiki:TracFastCgi FastCGI], [wiki:TracModPython ModPython], [trac:TracNginxRecipe TracNginxRecipe]