[TurboGears] ブログを作成する。その7
注意
この記事は、id:SumiTomohiko:20070122:1169468252の続きです。
mod_python, できませんでした。
以下の文献を参考にしながらtgdiaryをmod_pythonで動かそうとしてみたのですが、できませんでした。
- mod_python - nogosui.org
- 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)
ApacheとCherryPyを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からダウンロードできます。
参考になれば幸いです。