【はじめてのDjnagoデプロイ】nginx + gunicorn + upstartでdjangoを常時起動させる

upstartDjango
この記事は約10分で読めます。
スポンサードリンク

はじめに

Djnagoでつくったアプリケーションは、ロカールの開発環境であればアプリケーションdirectory内において、以下のコマンドで簡単に立ち上がります。

python manage.py runserver

今回は、Djangoアプリケーションを本番サーバー環境などにデプロイし、常時起動させるときの方法を紹介します。

デプロイの構成と流れ

今回は、全体のデプロイ構成と流れは以下の通りです。
(1)Webサーバーにnginxを用いる
(2)webサーバーのデフォルトポートである80番へアクセスするとDjnagoアプリケーションが見れるようにするため、nginxのリバースプロキシの設定をする
(3)Djangoをlocalhostの8000番ポートで立ち上げる
(4)gunicornコマンドを使ってDjangoを常時起動させる
(5)upstartによるinitプロセスで、gunicornコマンドが立ち上がるようにする

それでは、やっていきましょう。

Nginx

Nginxのインストール

今回はCentOSを用いたのでyumを使ってnginxをインストールします。
Ubutuなど使っている場合は、apt-getでインストールしてください。

yum install nginx

インストールができたら起動できるか確認しておきましょう。

以下のコマンドを実行し、「OK」の表示がでたら大丈夫です。

service nginx start

Nginxの設定

nginxのインストールが完了したら、次にリバースプロキシの設定をしていきます。

まず、/etc/nginx/に移動し、nginx.confを編集していきます。
nginx.conf編集をする前に、オリジナルのnginx.confをnginx.conf.orgとしてバックアップをとっておきましょう。

cd /etc/nginx
cp nginx.conf nginx.conf.org

次に、vimで、nginx.confを開いて、ファイルの中身を次のように編集していきます
ここで、基本的なリバースプロキシの設定をしていきます。

#  For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/
user server-user-name; # change here : set your server-user name
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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"';

    sendfile        on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;

    index   index.html;
  
  # ここで、リバースプロキシの設定をする
    upstream app_server {
        server 127.0.0.1:8000 fail_timeout=0;
    }

    server {
        listen       80;
        server_name  your-domain.com; # ここに表示するドメインを指定
        root         /path/to/your/app; # ここにdjangoアプリケーションのパスを指定

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

        location / {
            try_files $uri @proxy_to_app;
        }

        location @proxy_to_app {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass   http://app_server;
        }

        error_page  404              /404.html;
        location = /40x.html {
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }

    }

}

上の設定では、あなたが指定したドメインdomain.comに対して、80ポートでアクセスがきたときに、
upstream app_serverで設定した127.0.0.1:8000を見にいくようになっています。

↓上のこの部分

upstream app_server {
    server 127.0.0.1:8000 fail_timeout=0;
}

Djnagoの設定

次に、Djangoをgunicornを使って立ち上げられるように設定していきましょう。
今回は、Demoという名前のプロジェクトを作成し、そのプロジェクト内でbaseというアプリケーションをつくります。
階層は以下のようになっています。

Demo/
- Demo/
  - settings.py
  - wsgi.py
  - urls.py
- manage.py
- base/
  - settings.py
  - urls.py

まずは、gunicornをインストールします。

pip install gunicorn

インストールができたら、djangoプロジェクトの./Demo/settings.pyにおけるINSTALLED_APPSにgunicornを追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bootstrapform',
    'gunicorn', # ここ
]

ここまでできたら、gunicornをつかってDemoアプリケーションが立ち上がるかテストしてみましょう。以下のコマンドでwsgiサーバーを立ち上げます。

 gunicron Demo.wsgi

問題なく立ち上がると、コンソール上に以下のような表示が出力されます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-11-17-38-57

ちなみに、hostやportは、-bオプションで設定できます。

 gunicron Demo.wsgi -b 0.0.0.0:8000

 

upstartの設定

ここまでの作業で、Nginxの設定およびDjangoをgunicornから立ち上げることができるようになりました。

gunicornでDjanngoアプリケーションが立ち上がるのは確認できましたが、作業しているサーバーからぬけるdjangoのアプリケーションを立ち上げているgunicornのプロセスも止まってしまいます。

Djnagoアプリケーションを立ち上げるgunicornプロセスは、常に起動してアクセスできるようにしておく必要があるので、そのための設定をしていきましょう。

このようなデプロイのための常時起動設定等に関しては、実際のところ方法がいくつかあります。
ドキュメントにも方法がいくつか紹介されているので参考にしてみてください。

Django をデプロイする | Django ドキュメント | Django

ここではupstartを使って自動起動できるように設定していきます。
具体的には、initシステムで、Djnangoアプリケーションを立ち上げるgunicornプロセスが起動されるような設定を行います。ちなみに、initシステムは、コンピュターが起動する時に自動で必要なプログラムを立ち上げるためのものです。

つまり、initシステム内で、gunicornコマンドを起動するように設定することでDjnagoアプリケーションが常時立ち上がるようにします。

それでは、設定していきましょう。

まずは、/etc/initに移動します

cd /etc/init

そしてinitctlコマンドを以下のように実行してみてください(一般に、root権限が必要)

initctl list

そうすると、以下のようにinitシステムで立ち上がっているタスク一覧をみることができます。左側にタスク名、右側に状態(start/running or stop/waiting)が確認できるかと思います。

rc stop/waiting
tty (/dev/tty1) start/running, process 1448
plymouth-shutdown stop/waiting
.
.
.
annotation-app start/running, process 20784
readahead-disable-services stop/waiting
serial (ttyS0) start/running, process 1447
ck-log-system-stop stop/waiting
rcS-sulogin stop/waiting                   

また、/etc/initにて、lsコマンドを実行してみると上で表示されたタスクの設定が記述されたファイル一覧が確認できます。

上記のように表示されたタスクの一覧に、Djnagoアプリケーションを立ち上げるgunicornのプロセスも表示されれば、アプリケーションを常時起動できるようになります。

そのためには、/etc/itit内に、設定ファイルを作っておく必要があります。なので、djangoを立ち上げる用の設定ファイルを作っていきましょう。
まずは、vimでdemo-app.confというファイルを作成して開きましょう。(ファイル名{demo-app}は任意で置き換えて下さい。)

vim /etc/init/demo-app.conf

demo-app.confの中身を以下のように設定していきます。

description "Demo App Server"

start on runlevel [2345]
stop on runlevel [016]

respawn
script
su - username
/path/to/gunicorn -b 127.0.0.1:8000 --chdir /path/to/django/app demo.wsgi
end script

ここで、/path/to/gunicornは、以下のコマンドで返される値を設定します。

which gunicorn

また、/path/to/django/app demo.wsgiは、任意のパスやdjnangoアプリケーション名に置き換えて下さい。

編集が完了したらEsc->:wqで保存してvimエディターを閉じましょう。これで設定ファイルの用意ができました。

最後に、以下のinitctlコマンドで作成した設定ファイルをinitシステムに反映しましょう。

initctl start demo-app

ちなみに、停止したい場合は、こちらのコマンドです。

initctl stop demo-app

起動確認

ここまで設定できたら、このサーバー環境のドメイン名(domain.com)もしくはIPアドレスにアクセスして、djangoアプリケーションが立ち上がっているの確認できたら完了です。

オススメのプログラミングスクール紹介

【TechAcademy】自宅で学べる!プログラミングスクール

まずは無料体験からでも始められます

★ここがポイント!

 自宅にいながらオンラインで勉強できる
◎ パーソナルメンターがついて指導!

◎ チャットで質問もOK
◎ あなたのオリジナルサービスの開発をサポート!

DjangoPythonプログラミング
スポンサードリンク
あれは魔法だろうか?
タイトルとURLをコピーしました