nginxのインストールは省略。ubuntuならaptitudeでインストールすればいい。デフォルトはちょっと古いけど。 djangoで作ったmysiteプロジェクトを/path/to/mysiteに置いているという前提。

uwsgiをインストール

全てvirtualenv上で行うとよさげ。 uWSGI で Django を使う方法 — Django 1.4 documentationほぼそのまま

$ source path/to/virtualenv/bin/activate
$(virtualenv) pip install uwsgi

uwsgi.iniを作る

djangoのプロジェクトを/path/to/mysiteに置いた場合の設定。pidfile,daemonizeはプロジェクト毎に適当に設定。

# uwsgi.ini
[uwsgi]
chdir=/path/to/mysite
module='mysite.wsgi:application'
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/mysite.log
socket=127.0.0.1:1234 #適当なポート
env= DJANGO_SETTINGS_MODULE=mysite.settings

virtualenvで使う場合、sudoを使わないでuwsgiを起動するので、/var/log/uwsgi/yourproject.logの権限に注意する。 uwsgiの起動や終了のコマンドは以下の通り

起動
$ uwsgi --ini uwsgi.ini
再起動
$ uwsgi --reload /tmp/project-master.pid
終了
$ uwsgi --stop /tmp/project-master.pid

nginxの設定

Setting up Django and your web server with uWSGI and nginx — uWSGI 2.0 documentationを参考にした。

uwsgi_params

uwsgi_paramsは/etc/nginx/uwsgi_paramsに入ってるけど、修正する可能性もあるので、/path/to/mysite/uwsgi_paramsにコピーして、それを修正する。

nginx.conf

upstream django {
    server 127.0.0.1:1234; #uwsgi.iniで設定したポート番号
}

server {
    server_name hoge.example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
# max upload size
    client_max_body_size 75M;   # adjust to taste
# Django media
# Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /path/to/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
}

これを作成して、/etc/nginx/sites-enabledへシンボリックリンクを貼っておけば良い

$ service nginx restart #reloadでもいい?

でWebアクセスできるようになる。はず。

静的ファイルの設定手順

nginx+uwsgiでプロジェクトを公開した場合、manage.py runserverの場合と違い、静的ファイルの置場を設定しないといけないっぽい

location ~ ^/static/ {
root /path/to/mysite;
break;
}

settings.pyにSTATIC_URL, STATIC_ROOTを追加

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = "/path/to/mysite/static"

テンプレでは次のように静的ファイルにアクセスする

<script type="text/javascript" src="{{ STATIC_URL }}js/hoge.js"></script>

この設定だけでは静的ファイルが/path/to/mysite/staticに入ってないので、collectstaticコマンドを使ってファイルを集める

$ python manage.py collectstatic

これで各アプリに入ってる静的ファイルとadmin関連の静的ファイル全て持って来てくれる

設定反映

$ sudo service nginx reload #ubuntuの場合

deploy時に良く使うメモ

mysite/settings.pyを以外を設定ファイルとして読み込む場合はmanage.pyに以下のオプションを付ける uwsgi.iniのenvも変更しておく

--settings=mysite.settings_deploy

設定ファイルは例えばこんな感じで書いて、元のsettings.pyを上書きする

from pystock.settings import *
DATABASES = {
    .......
}