2010年9月27日月曜日

gunicorn で web.py 製のアプリケーションを動かす



gunicorn とは Ruby の unicorn を元に開発された Python 用の HTTP サーバです。この gunicorn を使って web.py 製のアプリケーションを動かすことができたのでその備忘録。


後々 nginx と連携させて自作の Web アプリをデプロイしたいなーとか思ってます。


今回構築した環境は



  • OS: Mac OS X Snow Leopard

  • Python: 2.6.6 (MacPortsより)

  • web.py: 0.33 (easy_install にて)

  • gunicorn: 0.8.1 (easy_install にて)


web.py と gunicorn はそれぞれ



$ sudo easy_install-2.6 web.py
$ sudo easy_install-2.6 gunicorn


でインストールしました。


また、MacPorts からインストールした easy_install を使った場合、gunicorn は /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin にインストールされます。PATH が通ってない場合はあらかじめ設定しておく必要があります。


今回使ったソースは web.py の公式でも紹介されている 'Hello World!' アプリです。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals())

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


このソースを一行書き換えれば gunicorn (というか WSGI)への対応完了です。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals()).wsgifunc() # <- .wsgifunc() を追加!

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


次に、gunicorn での起動方法です。app.py が置いてあるディレクトリで以下のコマンドを実行します。



$ gunicorn app:app
2010-09-26 22:23:50 [93920] [INFO] Arbiter booted
2010-09-26 22:23:50 [93920] [INFO] Listening at: http://127.0.0.1:8000
2010-09-26 22:23:50 [93922] [INFO] Worker spawned (pid: 93922)


これで起動完了です。 gunicorn に渡す引数は、(モジュール名):(変数名) です。今回の場合は app.py でモジュール名が app、wsgifunc()の返り値を代入してる変数名が app なので、app:app となります。


ファイルの変更が動的に反映されるので、開発時にはかなり便利ですね。


次は nginx と連携して動作させる設定を行なってみようと思います。


みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.09.23
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 75071


初めてのPython 第3版
初めてのPython 第3版
posted with amazlet at 10.09.23
Mark Lutz
オライリージャパン
売り上げランキング: 57132





0 件のコメント: