nginxとuwsgiとdjango を組み合わせる

今回は www.example.com/ にアクセスすると django のアプリケーションが起動するようにする。
流れはこんな感じ
1.www.example.com/ へのアクセスを nginx が受け取る
2.nginx がそれを 127.0.0.1:9090 で待ってる uwsgi へ渡す
3.uwsgi は起動時に指定されている django のハンドラを呼ぶ
これで django が起動してレスポンスが返される。


まずは nginx の nginx.conf の http 部分はこんな感じ。

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile         on;

    keepalive_timeout  5;

    gzip             on;
    gzip_disable     "MSIE [1-6]\.";

    server {
        listen       80;
        server_name  www.example.com;


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

        location /static/admin {
            alias /usr/local/lib/python2.7/site-packages/django/contrib/admin/media;
        }

    }

    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;
}

/static/admin の部分は css などの静的ファイル用。


で、次に uwsgi だけどまずはコマンドラインで起動している下記方法を真似する。

準備するファイルは django 起動用の /var/www/django/wsgi_app.py。
内容は以下の通り。

import os
import sys
import django.core.handlers.wsgi

os.environ['DJANGO_SETTINGS_MODULE'] = 'myApps.settings'
application = django.core.handlers.wsgi.WSGIHandler()

で、uwsgi を以下のコマンドラインで起動。

uwsgi --socket 127.0.0.1:9090 --pp /var/www/django --module wsgi_app

これで www.example.com/admin にアクセスすると、ちゃんと django の管理者ページが表示される。


最後に uwsgi を自動的に起動するようにしている下記方法を真似してみる。

uwsgi の起動用に準備するファイルが結構ある。

起動スクリプトと起動設定ファイルは、uwsgi の場所と uid 以外はまんまコピーで。
設定ファイルは自分の django の設定に合わせてパスなんかを変更。あ、あとはポート番号も。


ファイルの準備ができたら、uwsgi を chkconfig --add uwsgi で登録して、start で起動。

[paraches@localhost etc]$ sudo chmod +x /etc/init.d/uwsgi
[paraches@localhost etc]$ sudo /sbin/chkconfig --add uwsgi
[paraches@localhost etc]$ sudo /etc/init.d/uwsgi start
uwsgi を起動中: [uWSGI] getting YAML configuration from /etc/uwsgi.yaml
                                                           [  OK  ]
[paraches@localhost etc]$ 

これで www.example.com/admin にアクセすると、ちゃんと django の管理者ページが表示される。

ここで nginx のエラーメッセージが出たり、uWSGI のエラーが出る場合は /var/log/uwsgi.log を見ると何が問題なのか大抵の場合はわかるんじゃないかな。


エラーが出ずにちゃんと動いたので、uwsgi をサーバ起動時に動作させるようにする。

[paraches@localhost etc]$ sudo /sbin/chkconfig --level 345 uwsgi on

というわけで、nginx+uwsgi+django も動くようになりました!