trac と Django アプリケーションをapache+mod_pythonで

社内向けDjangoアプリを公開するためにapacheをセットアップして、ついでに課題管理用にtracをセットアップしてみた。
そしたら半日くらいはまったのでメモしておく。
環境は apache 2.0.59, mod_python 3.3.1, python 2.4, Django 0.96, trac 0.10.3.1-ja

理想としては http://www.djangoproject.com/ みたく、

  • www.servername -> Django アプリ
  • trac.servername -> trac サイト

としたかったんだけど、ネットワークの知識がないので断念した。


しかたないので、

  • servername -> Django アプリ
  • servername/trac -> trac サイト

という風にしようとhttpd.confをこう書いたら、tracサイトにアクセスできない。
/trac以下もDjangoにハンドルされているようだ。

<Location />
    PythonPath "['d:/django'] + sys.path"
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE djangoproject.settings
    PythonDebug off
</Location>
<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv d:/trac/tracproject
</Location>


それなら、といことで安易に

  • servername/django -> Django アプリ
  • servername/trac -> trac サイト

としようとしたら、tracサイトは見れるけどDjangoアプリは404だらけでまともにアクセスできなくなった。
URLマッパーが/djangoを切り取らないからっぽい。
というかlogin_requiredデコレータが/account/loginにリダイレクトするので困った。


いろいろ試行錯誤していたら、上記の設定をVirtualHostで囲んだら動いた。理由はよく分からない。
ついでにSubversionWebDAVも設定してみる。
結果としてこんな構成になった。

物理的な構成はこんなかんじ。

  • d:/django/djangoproject -> Djangoプロジェクト
  • d:/www/media -> Djangoの管理画面用メディアファイル
  • d:/www/site_media -> Djangoプロジェクト用メディアファイル
  • d:/trac/tracproject-> tracプロジェクト
  • d:/svn/repo-> Subversionリポジトリ

tracプロジェクトとSubversionリポジトリのアカウントは共通化した。
本当はDjangoの認証を利用したかったけど、うまくいかなかった。


httpd.confはこんなかんじ

DocumentRoot "d:/www"

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule python_module modules/mod_python.so
LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"
LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so"

<VirtualHost *>
#for Django
    <Location />
        PythonPath "['d:/django'] + sys.path"
        SetHandler python-program
        PythonHandler django.core.handlers.modpython
        SetEnv DJANGO_SETTINGS_MODULE djangoproject.settings
        PythonDebug off
    </Location>
    <Location /media>
        SetHandler None
    </Location>
    <Location /site_media>
        SetHandler None
    </Location>
#for trac
    <Location /trac>
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend
        PythonOption TracEnv d:/trac/tracproject
    </Location>
    <Location /trac/login>
        AuthType basic
        AuthName "Trac"
        Require valid-user
        AuthUserFile d:/trac/tracproject/.htpasswd
    </Location>
</VirtualHost>

#for Subversion
<location /svn>
    DAV svn
    SVNPath d:/svn/repo
    AuthType basic
    AuthName "Subversion"
    Require valid-user
    AuthUserFile d:/trac/tracproject/.htpasswd
</Location>