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.ini )
- 起動設定ファイル(uwsgi.sysconfig )
- 設定ファイル(uwsgi.yaml )
起動スクリプトと起動設定ファイルは、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 も動くようになりました!