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