log

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

gunicorn とは Rubyunicorn を元に開発された Python 用の HTTP サーバです。この gunicorn を使って web.py 製のアプリケーションを動かすことができたのでその備忘録。
後々 nginx と連携させて自作の Web アプリをデプロイしたいなーとか思ってます。

今回構築した環境は

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