やる気がストロングZERO

やる気のストロングスタイル

uWSGIの使い方(Djangoと使う場合)

Djangoを動かすのには

nginx -> uWSGI -> Django

という感じの構成にするのが良いっぽい。 uWSGIの使い方について調べたのでまとめる。

ここの荒い翻訳になっている。
Quickstart for Python/WSGI applications — uWSGI 2.0 documentation

インストール

pip install uwsgi

単体で実行

foobar.pyを用意。

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
uwsgi --http :9090 --wsgi-file foobar.py

これでlocalhost:9090でHello Worldが表示される。

※--httpはwebserverと共に使う時やパフォーマンスが必要なときはつかうな。--http-socketを使え

並行実行とモニタリング

プロセス追加したいときには--processesを使え。 スレッドを追加したい時には--threadsを使え。 デフォルトではシングルプロセスシングルスレッドで実行される。

wsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2

↑これだと4プロセスが作られ、それぞれに2スレッドが作られる。 さらに、これらを管理するマスタープロセスと、httpルーターが作られる。

アクセスのモニタリングをするには--statsオプションを使う。

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

↑これでなにかリクエストがあったらtelnetで9191ポートを見れば情報がみれる。

uwsgitop(pip install uwsgitop)を使うとtopコマンドのようにモニターできる。

nginxの後ろにuWSGIを設置する

uWSGIはFastCGIやSCGIなどとuwsgiと呼ばれるプロトコルで会話する。 これがベスト。

nginxの基本的な設定は以下

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:3031;
}

↑これが意味するのは「すべてのリクエストをポート3031へuwsgiプロトコルで送る」

これを下記コマンドで実行したuWSIGで受ける

uwsgi --socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

これでnginx越しに通信できる。 このときuWSGIはhttp routerのプロセスを生成しない。

もしプロキシやwebserverやrouterがhttpで通信したいなら下記コマンドでuWSGIを起動

wsgi --http-socket 127.0.01:3031 --wsgi-file foobar.py --master --precesses 4 --threades 2 --stats 127.0.0.1:9191

--http-socketオプションは--httpオプションと異なり、proxy用のプロセスを自分で生成しない。

Djangoのデプロイ

/home/foobar/myprojectにDjangoプロジェクトがあるとする時、以下コマンドで実行できる。

uwsgi --socket 127.0.0.1:3031 --chdir /home/foobar/myproject/ --wsgi-file myproject/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

Djangoがモジュールをロードする際にcurrent dirを要求するため --chdirを指定する必要がある。

コマンド引数が長くて辛い場合はiniファイルとして記述しておき、ファイル指定で実行することもできる。

iniファイル

[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191

実行コマンド

uwsgi yourfile.ini