読者です 読者をやめる 読者になる 読者になる

FAPWS2でDjangoを動かす

WSGI Django

FAPWS2(Fast Asynchronous Python Web Server)はlibeventを使って書かれたWSGIサーバライブラリ。こいつは本当に速いぞ!

インストール

インストールには多分libevent-1.4.3-stableが必須。libevent-1.4.3-stableのバイナリをインストールしてあるだけではなく、ソースコードも必要。

最新版をレポジトリから取得して、ビルドする。ビルドにあたっては、

  • 環境変数LIBEVENT_SRCにlibeventのソースディレクトリを指定する
  • libevent.soをインストールしたパスが/usr/libでなければ、setup.pyを書き換える必要がある

という二点に注意。

$ git clone git://git.opensource4you.com/home/william/git_repos/fapws2
$ cd fapws2
$ export LIBEVENT_SRC=~/src/libevent-1.4.3-stable
$ python setup.py build
$ sudo python setup.py install

Djangoを動かす

fapws2.contrib.django_handlerというモジュールがあり、配布物にもDjangoを動かすためのサンプルがあるのだが、trunk版のDjangoでは動かない。なので、自分で書く。

#!/usr/bin/env python
import _evhttp as evhttp
from fapws2 import base
from django.core.handlers.wsgi import WSGIHandler

# since we don't use threads, internal checks are no more required
import sys
sys.setcheckinterval=100000

def start():
    evhttp.start("0.0.0.0", 8000)
    wsgi_handler = WSGIHandler()
    def handler(environ, start_response):
        res = wsgi_handler(environ, start_response)
        return [str(res.content)]

    evhttp.set_base_module(base)
    evhttp.gen_http_cb(handler)
    evhttp.event_dispatch()

if __name__=="__main__":
    start()

このスクリプトをrun.pyのような名前で保存して、

$ PYTHONPATH=/path/to/myproject DJANGO_SETTINGS_MODULE=myproject.settings python run.py

でサーバを起動。

あまり複雑なことをやらないアプリケーションならば、普通に動く。ただ、WSGI環境変数のREMOTE_ADDR等を設定してくれないし、出力時にはContent-Lenghtを自分でつけなくてはいけない等、制限が多い。

性能

100Kbyteのコンテンツを返すDjangoアプリケーションを、

$ ab -n 1000 http://localhost/

で計測。

Requests per second 537.62 [#/sec] (mean) fapws2に直接リクエスト
Requests per second 308.63 [#/sec] (mean) lighttpd 1.4のproxy経由
Requests per second 168.63 [#/sec] (mean) lighttpd 1.4+FastCGI(flup)
Requests per second 319.48 [#/sec] (mean) nginx+fapws2
Requests per second 177.93 [#/sec] (mean) nginx+FastCGI(flup)

FastCGIより速い?DBの処理が入った時どう変わってくるかだな。

【追記】nginx 0.5.35を試してみた。