[TurboGears] ブログを作成する。その7

注意

この記事は、id:SumiTomohiko:20070122:1169468252の続きです。

mod_python, できませんでした。

以下の文献を参考にしながらtgdiaryをmod_pythonで動かそうとしてみたのですが、できませんでした。

  1. mod_python - nogosui.org
  2. id:t2ru:20060916:1158384827

悪戦苦闘したのですが、mod_pythonで動かすと「データベースの形式が違う」というエラーになってしまったのですが(正確にどんなメッセージだったのかは忘れました)、原因が突き止められませんでした。CherryPyでは動くのですが...。1.0 - TurboGears Documentationを参照しても、mod_pythonに関する説明はないようです。なので、今回はmod_proxyで逃げることにしました。

なお、BehindApache - CherryPy - Tracによると、一番いいのはmod_rewriteを使う方法だと書いてありますが、私にはmod_rewriteは難しいので見送りました。

mod_proxy(とmod_headers)

ApacheCherryPyをmod_proxyでつなぐためには、以下の設定をApacheに追加します。なおここでは、tgdiaryにはhttp://example.com/tgdiaryでアクセスし、CherryPyは8080番ポートを使用することとしています。


    ProxyPass http://localhost:8080
    ProxyPassReverse http://localhost:8080
    RequestHeader set CP-Location /tgdiary
    Order Deny,Allow

プロキシの設定は、ProxyPassとProxyPassReverseの2つです。ProxyPassで、http://example.com/tgdiaryにアクセスしたら、http://localhost:8080にアクセスするようにしています。また、ProxyPassReverseで、http://localhost:8080からリダイレクトが返ってきたら、URLに/tgdiaryをつけるようにしています。

RequestHeaderでは、http://example.com/tgdiaryにアクセスした場合、http://localhost:8080へのリクエストのヘッダに"CP-Location: /tgdiary"を追加するようにしています。このヘッダを追加する理由は、CherryPyにアクセスされているパスを教えるためです。例えば、開発しているときは"/login"だったパスを、mod_proxyを通した場合は"/tgdiary/login"にしなければなりません。そこで、下の関数を作成し、パスを変換するようにします。

def build_url(url):
    if url.startswith('/'):
        location = cherrypy.request.headers.get("CP-Location", "")
        return location + url
    return url

この関数は、CP-Locationがない場合は何もパスに追加しないので、CherryPyに直接アクセスしても、これまで通りに動作させることができます。

このRequestHeaderは、mod_headersモジュールによる機能です。したがって、mod_proxyの他に、mod_headersもインストールしてください。

なお、上にも述べたように、CherryPyから返されるリダイレクトについては、mod_proxyがパスを修正しますので、リダイレクトするパスにbuild_url関数を適用させる必要はありません。

完成

これで、tgdiaryはひとまず完成ということにします。

サンプルをhttp://nekomimists.ddo.jp/tgdiaryに設置しました。ユーザ名はguest, パスワードはguestでログインできます。

ソースコードは、http://nekomimists.ddo.jp/~tom/repository/tgdiary.tar.gzからダウンロードできます。

参考になれば幸いです。