アプリケーションコンテナ uWSGIを試してみた

written by shn, on Dec 4, 2010 10:55:00 PM.

このベンチマークで気になったアプリケーションコンテナuWSGIを試してみた。

uWSGIは独自のプロトコルでフロントエンドのWebサーバと通信するアプリケーションコンテナで、中身はPythonをメインターゲットにしているが、Perl, Erlang, Ruby(開発中)も動かせるらしい。独自プロトコルということで、Webサーバ側にもプラグインがいるが、nginxは0.8.40以上だったら組み込まれている。

気になった背景に、いままでWebサービスはnginx <-- [HTTP] --> pythonという組み合わせで使うことが多かったのだけれども、nginxのReverse Proxyが持続的接続をサポートしてなかったりしてイマイチだった。HTTPの代わりとなるとFastCGIかな、というところなのだが、python側のflupsがあんまり速くないなぁという印象。どうなんだろう。みんなどうやってんの?

uwsgiのビルドについては省略。pythonを複数バージョン使っている場合はバージョンごとにビルドする必要がある。

実行してみる

$ uwsgi2.6 -s 127.0.0.1:3031 -H env -w apploader

virtualenvを使っているので、そのディレクトリを -H で指定。WSGI appのためのブートストラップは -w で指定するのだがオレオレWAFを使っているのでapploader.pyを用意して、そこでapplicationをロードするようにした。

#!/usr/bin/env python

application = build_application(...) # 省略

nginx側ではnginx.conf内で以下のようにしてつなぐ

uwsgi_pass   127.0.0.1:3031;
include      uwsgi_params;

これで、nginxからuwsgiがたたけた! やったぜバンザイ

便利な機能

Master Process

上の例でuwsgiを動かすと、以下のメッセージが出る

*** WARNING: you are running uWSGI without its master process manager ***

-Mオプションを指定すると、worker processの親にmaster processを立ち上げるようになる(nginxと似たような感じ)(解説) master processを用いると、子プロセスのメモリを制限したり、Timeoutした場合に強制的に殺したりできるようになる。

Fork

PythonはGILがあるため、Workerをforkさせたかったりすることがあるのだが、そのあたりもuwsgiが面倒(-P [N])を見てくれる。(解説)

というわけで、

日本語文献が見当たらなかったので紹介記事を書いてみたけど、まだあんまり使ってないので書くことが無い!

Leave a Reply