Nginx+Gunicorn+AWSでDjangoの起動画面を表示するまでのメモ


これは個人的に勉強のために行った際のメモです。

環境

Amazon Linux AMI 2015.03 (HVM), SSD Volume Type – ami-cbf90ecb
Django 1.8.1
Gunicorn 19.3.0
Nginx 1.6.2

各インストール方法など

Django 1.8.1、Gunicorn 19.3.0はpip。
Nginx 1.6.2はyum。Amazon Linuxに入っているリポジトリの物を利用。最新バージョンは1.9.0なので注意。Nginx インストールメモ-はじめてのAWS | kazsoga(曽我一弘)ブログ

Nginxの設定

Nginxのnginx.confの編集をします。
$ cd /etc/nginx/
$ sudo vi nginx.conf
編集した箇所は、2箇所
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;

server {
listen 80;
server_name 設定したいドメイン(AWSならパブリックDNS); # 変更した行
root /usr/share/nginx/html;


location / {
}

location / {
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; # 追加した行
proxy_set_header Host $http_host; # 追加した行
proxy_set_header X-FORWARDED_PROTO https; # 追加した行
proxy_redirect off; # 追加した行
proxy_pass http://127.0.0.1:8000; # 追加した行
}

でファイルを保存。

追記:
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; # 追加した行
proxy_set_header Host $http_host; # 追加した行
proxy_set_header X-FORWARDED_PROTO https; # 追加した行
proxy_redirect off; # 追加した行

はなくても動作した。

Nginxの起動

$ sudo nginx
もし起動済みであれば再起動。
$ sudo /etc/init.d/nginx restart

Gunicornの設定方法

Djangoのプロジェクトを作成して、setting.pyのINSTALLED_APPSにgunicornを追加。
$ django-admin.py startproject projectname
$ cd projectname/projectname
$ vi setting.py

具体的には、以下の部分。
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'gunicorn', # 追加した行
)

Gunicornの起動

manege.pyの階層に移動。
$ cd ../
gunicornを起動
$ gunicorn projectname.wsgi
[2015-05-10 10:30:16 +0000] [3079] [INFO] Starting gunicorn 19.3.0
[2015-05-10 10:30:16 +0000] [3079] [INFO] Listening at: http://127.0.0.1:8000 (3079)
[2015-05-10 10:30:16 +0000] [3079] [INFO] Using worker: sync
[2015-05-10 10:30:16 +0000] [3082] [INFO] Booting worker with pid: 3082

この状態で、nginxで設定したserver_nameのURLにアクセスすると、It worked!の画面が見えます。

Nginx+Gunicorn+AWSでDjangoの起動

念のため、gunicornをControl+Cで停止して、
^C[2015-05-10 10:32:43 +0000] [3079] [INFO] Handling signal: int
[2015-05-10 10:32:43 +0000] [3082] [INFO] Worker exiting (pid: 3082)
[2015-05-10 10:32:43 +0000] [3079] [INFO] Shutting down: Master

先ほどのURLにアクセスすると、nginx error!が表示されます。
nginx error!
これで少なくとも、gunicornとnginxが連携できていたことがわかります。

今後の課題

/adminの画面が崩れの修正方法調査→Nginx+Gunicorn+AWSでDjangoのadmin画面が崩れているのを修正した時のメモ | kazsoga(曽我一弘)ブログ
gunicornをバックグラウドで動かす方法の調査。
gunicornをconfファイルで動かす方法の調査。
run_gunicorn、gunicorn_djangoなどのコマンドの使い方調査。
→ImportError: No module named ‘django.core.management.validation’が出る。

参考ページ

以下のページを参考にしました。ただし、nginx.confを編集後nginxが再起動できなかったり、gunicornのコマンドで上記エラーが出たりしており、最終的にnginx.confの内容を読んで、探り探り編集しました。バージョンなどによって、設定ファイルがいろいろと変わりそうな気がしています。
djangoをnginx gunicornで動かす。テキトー。 – podhmoの日記
Deploying Gunicorn — Gunicorn 19.3.0 documentation
AWSのEC2にdjango1.5+nginx+gunicornで環境構築してみた | 日々勉強、日々勉強
Djangoで作ったアプリケーションをGunicorn + Nginxの環境のもとデプロイする | furodrive
nginx + gunicorn + Django やってみた – source