oinume journal

Scratchpad of what I learned

uWSGI+virtualenv+Flask

Pythonで今一番熱そうなWSGIコンテナのuWSGIというものをインストールしてみたんだけど、virtualenvと組み合わせた時にちょっとはまったのでメモ。

前提

  • Pythonは2.6
  • virtualenv(wrapper)を使って /usr/local/virtualenvs 配下に flask という環境を作っている
  • flask には Flask や Jinja2 などアプリの実行に必要なものがインストールされている
  • 実行するアプリは /var/www/wiki-converter にディプロイされている(wiki-converterのソース)

uWSGIのインストール

$ workon flask
$ pip install uwsgi

でいける。

uWSGIの起動

まずは本格的なアプリを起動する前にQuickstartに書いてあるhello world的なものを試しみる。

# /var/www/hello.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"

起動

$ uwsgi --http :9090 --wsgi-file /var/www/hello.py

これでブラウザから localhost:9090 にアクセスして"Hello World"が表示されればうまくいっている。

次はFlaskアプリで試してみる。

$ uwsgi --http :9090 -H /usr/local/virtualenvs/flask --python-path /var/www/wiki-converter -w wiki_converter:app

で起動できる。

  • -H でvirtualenv な環境のディレクトリを指定
  • --python-pathにアプリがあるディレクトリを指定

しているのがミソ。-Hがない場合 flask が見つからなくて

ImportError: No module named flask
unable to load app mountpoint

というエラーが出てuwsgiがうまく起動できないので注意!

なお、uWSGIはnginxと組み合わせてよく使われるらしい。nginxとの組み合わせについてはCentOSでnginx + uwsgi + Djangoを試してみた « taichino.com:が詳しい。