アプリケーションコンテナ uWSGIを試してみた
このベンチマークで気になったアプリケーションコンテナ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])を見てくれる。(解説)
というわけで、
日本語文献が見当たらなかったので紹介記事を書いてみたけど、まだあんまり使ってないので書くことが無い!