Djangoを使ってみる その2 – nginxとuWSGIの設定

投稿者: | 2013年6月16日

基本的なところは動かせるようになったので次はnginxとuWSGIのインストール、設定を行って外から見えるようにします。
このあたりは前にpythonをuWSGI経由で使えるようにしようと思った時に、本体とあまり関係ないのによくわからなくてやる気をかなり削がれたところです(笑
書いてみるとそこまでではないですね。ただし毎度のごとく正確な内容かどうかの保証はできませんが……

今回インストールしたバージョンは
nginx 1.4.1
uWSGI 1.9.12
です。

nginxのインストールと設定

portsのwww/nginxにあるので特にconfigも変更しないでここからインストールしました。
/etc/rc.confにもnginx_enable=”yes”を追加しておきます。
設定ファイルは/usr/local/etc/nginxにあるのでuWSGIと接続する設定を追加します。
nginx.confのlocation部分を変更

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

uWSGIとは127.0.0.1:49152でデータのやりとりをすることにします。uWSGI側もあとで合わせた設定にします。

rc.confにも書いたのでnginxは最起動時に立ち上がりますが、手動で起動する場合は

/usr/local/etc/rc.d/nginx start

 

uWSGIのインストールと設定

仮想環境にpipでインストール。

[testenv] %pip install uwsgi

設定ファイルはtestenvの下にetc/wsgi.iniとして作り、以下のような内容を記述。
iniファイルはどこに置くのが良いのかはわかりませんが、仮想環境下にbinが作成されるので同じような感じでetcを作ることにしました。

[uwsgi]
socket = 127.0.0.1:49152
processes = 5
master = true
chdir = /home/ichinomoto/testenv/testproject
module = testproject.wsgi:application
harakiri = 20
max-requests = 5000
vacuum = true
pidfile=var/testproject.pid
daemonize=var/testproject.log

socketはnginx.confのuwsgi_passに書いた物と同じにします。サイトによっては/tmp/testproject.sockのようにファイルにしてあるところもありますが、その場合nginx.confにあるuwsgi_passの書き方が”wsgi_pass unix:///tmp/testproject.sock”のようになります。詳細は他のサイトを参照のこと。
設定が固まるまではフォアグラウンドで動かしておくために最後のdaemonizeは外した方が良いかもしれません。
なお、この設定にするのであればpidファイルとdaemonizeに書いたログファイルのためにvirtualenvの下にvarディレクトリを作っておきます。

起動時には設定ファイルを指定します。
なお、pidとログファイルの位置は相対パスになるのでvirtualenvの直下から起動する前提で書いてあります。起動スクリプトを書いてbinの下に置いておくなどした方が良いかもしれません。

[testenv] %uwsgi --ini etc/wsgi.ini

停止は、フォアグラウンドならCtrl-Cで。
daemonize=var/testproject.logを設定している場合にはQUITシグナルを送ります。

%kill -QUIT `cat var/testproject.pid`

ここまでできたらあとは中身を作ることに専念できます。
 

[追記]
面倒なので結局起動スクリプトを作りました。
これを使う場合はwsgi.iniにあるpidfile行とdaemonize行がかぶるのでコメントアウトしてください。
vitualenvのbinの下にtestenv_ctrl.shとして作成しました。

#!/bin/sh

virtualenv_dir="/home/ichinomoto/testenv/"
wsgi_ini="${virtualenv_dir}etc/wsgi.ini"
wsgi_pid="${virtualenv_dir}var/testproject.pid"
wsgi_log="${virtualenv_dir}var/testproject.log"

start(){
    echo "uWSGI testproject start"
    uwsgi --ini $wsgi_ini --daemonize $wsgi_log --pidfile $wsgi_pid
}

stop(){
    echo "uWSGI testproject stop"
    kill -QUIT `cat $wsgi_pid`
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
esac

virtualenv環境に入ればパスが通った状態になるので

[testenv] %testenv_ctrl.sh start

で起動できます。あとstopとrestartも。
 
 
[参考]
仮想環境ではなくFreeBSD本体側にuwsgiを入れる場合の参考に。
FreeBSD + Django + nginx + uWSGI
こちらのサイトではrc.confに起動オプションを書いてuwsgiを起動しています。
上の説明ではiniファイルを作りましたがすべて引数で渡すことも可能です。

Djangoを使ってみる その2 – nginxとuWSGIの設定」への2件のフィードバック

  1. びんぢ

    log ファイルを cat しても pid はわからないです。
    あと、普通 止めてから起動しますが、 uWSGI には reload に設定したファイルに touch コマンドなどでファイルの日時を更新すると reload してくれます。

    参考になりました。ありがとうございました。

    返信
  2. ichinomoto 投稿作成者

    ミスの指摘ありがとうございます。確かにlogファイル見てもしょうがないですね。
    reloadもファイルにtouchするだけでできるのは知りませんでした。
    情報ありがとうございます。

    返信

コメントを残す

メールアドレスが公開されることはありません。