2008年8月30日

mod_pythonでPasteベースなwsgiアプリケーションをvirtualenv内で動かすための8ステップ

mod_pythonでPasteベースなwsgiアプリケーションをvirtualenv内で動かすための8ステップ


1.setuptoolsをインストールする

http://peak.telecommunity.com/dist/ez_setup.py をダウンロード
$ sudo python ez_setup.py

2.virtualenvをインストールしてバーチャル環境を作る

$ sudo easy_install virtualenv
$ mkdir ~/ENV
$ cd ~/ENV
$ virtualenv mysite
$ . mysite/bin/activate

3.バーチャル環境にPasteなどをインストール

(mysite)$ easy_install Paste PasteDeploy PasteScript

4.サンプルアプリケーションを作成

(mysite)$ mkdir ~/webapps
(mysite)$ cd ~/webapps
(mysite)$ paste create -t paste_deploy mysite

5.WSGIアプリケーションローダー

mod_pythonで動かすには、PasteDeployを使ってWSGIアプリケーションをロードする。
~/webapps/mysite/wsgiloader.py
import os
from paste.deploy.loadwsgi import loadapp

uri = "config:%s" % os.path.join(os.path.dirname(__file__), 'devel_config.ini')

application = loadapp(uri)

6.wsgi_handler

mod_pythonからwsgiアプリを動かすためのスクリプト
http://trac.gerf.org/pse/wiki/WSGIHandler
~/webapps/mysite/wsgi_handler.py に保存
PATH_INFOの処理がおかしいので修正
--- wsgi_handler.py.orig 2008-08-30 02:23:11.000000000 +0900
+++ wsgi_handler.py 2008-08-30 03:29:38.000000000 +0900
@@ -130,7 +130,7 @@
# required for WSGI to work properly
environ['PATH_TRANSLATED'] = self.req.filename
# this should be right...
- environ['PATH_INFO'] = environ['SCRIPT_NAME']
+ environ['PATH_INFO'] = environ['REQUEST_URI'][len(environ['SCRIPT_NAME']):]

environ['wsgi.input'] = WSGIInput(self.req)
environ['wsgi.errors'] = WSGIError(self.req)

7.virtualenv のためのhandler

バーチャル環境のライブラリをロードするためのスクリプト
~/webapps/mysite/virtualhandler.py
import os
import site
site.addsitedir('/home/*****/ENV/mysite/lib/python2.4/site-packages/')

from wsgi_handler import handler

8.Apacheディレクティブを設定

PythonDebugやPythonAutoReloadはお好きなように。
<Location /mysite/>
PythonPath "['/home/*****/ENV/mysite/bin'] + sys.path"
SetHandler python-program
PythonHandler virtualhandler
PythonOption WSGI.Application wsgiloader::application
PythonDebug On
PythonAutoReload On
</Location>