Date: 2009-08-08
Tags: event, zope, python

buildoutで開発 4: mod_wsgiからegg指定でアプリ起動する

buildoutで開発1: WSGIアプリをeggで作る では、以下のようにwsgiappパッケージの中のstartup.pyを直接指定して起動していましたが、もっと取り回しやすくします。(今回はbuildout出てきません)

httpd-wsgi.conf:

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonPath c:/project/buildout/env1/lib
WSGIPythonEggs c:/project/buildout/env1/wsgiapp
WSGIScriptAlias /test c:/project/buildout/env1/wsgiapp/wsgiapp/startup.py

上記を以下のように書けるようにします(違うのは最後の行だけ)。

httpd-wsgi.conf:

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonPath c:/project/buildout/env1/lib
WSGIPythonEggs c:/project/buildout/env1/wsgiapp
WSGIScriptAlias /test c:/wsgi.py

このwsgi.pyはどこにあってもOK。中身は以下のようにpasteの仕組みを使っています。

wsgi.py:

import os
from paste.deploy import loadapp

ini = os.path.join(os.path.dirname(__file__), 'wsgi.ini')
application = loadapp('config:%s' % ini)

wsgi.ini はwsgi.pyと同じ所に置いてください。別の所に起きたければini変数においたパスを入れてください。 こう書くことで、実際にapplicationに格納される関数は、wsgi.iniの[server:main]に記載されているものになるので、このラッパー(wsgi.py)があればpasterで起動するときもmod_wsgiで動かすときも、同じエントリーポイントが使用されます。

これで、pasterコマンドでテストしてるときと、mod_wsgiから呼び出されるときとでほぼ同じ挙動になるはず。あと、wsgiappがegg化されていて、eggファイル名にバージョン番号やpy24とかpy25とか付いていても大丈夫。

mod_wsgiで使えるディレクティブは ConfigurationDirectives - modwsgi - The mod_wsgi configuration directives. - Project Hosting on Google Code を参照して設定する。

ということで改めて新しい環境にインストールから。

iniとpyファイルをenv3ディレクトリ直下に作る.

wsgi.ini:

[app:main]
use = egg:wsgiapp

[server:main]
use = egg:Paste#http
host = 127.0.0.1
port = 8180

wsgi.py:

import os
from paste.deploy import loadapp

ini = os.path.join(os.path.dirname(__file__), 'wsgi.ini')
application = loadapp('config:%s' % ini)

httpd-wsgi.conf(env1->env3 に注意):

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonPath c:/project/buildout/env3/lib;c:/project/buildout/env3/lib/site-packages
WSGIScriptAlias /test c:/project/buildout/env3/wsgi.py

<Directory c:/project/buildout/env3/>
    Order allow,deny
    Allow from all
</Directory>

動いた! 動いたけど、WSGIPythonPathの指定にsite-packagesも指定するなんて事かかずに、 WSGIPythonHomeを定義したい。 でもWindowsのmod_wsgiではWSGIPythonHomeを指定するとApacheが「そんなディレクティブないよ」とエラーになる!なんで?

とりあえずLinuxの人はWSGIPythonHomeを使いましょう。

なお、mod_wsgiで使えるディレクティブは ConfigurationDirectives - modwsgi - The mod_wsgi configuration directives. - Project Hosting on Google Code を参照して設定する。

次は

  • easy_install PasteDeploy せずにwsgiappインストールだけですむようにする

  • wsgi.ini と wsgi.py が自動的に作られるようにする(ドコに?)