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

systemdDjango
この記事は約10分で読めます。

はじめに

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

python manage.py runserver

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

デプロイの構成と流れ

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

 

systemdの設定

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

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

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

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

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

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

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

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

まず、起動時に読み込むためのserviceファイルを作成し、自動起動をするための設定などをこのファイルに記述します。

次に、そのserviceファイルをsystemctlコマンドで有効化し、自動起動時に読み込まれるように設定していきます。

serviceファイルを作成

まずは、serviceファイルを作っていきます。
/etc/systemd/systemに移動し、vimでファイルを作成します。

cd /etc/systemd/system/
vim app.service
# appは任意の名前で設定してください。

次に、serviceファイルの中身を以下のように記述していきます。

app.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu  # 実行するサーバーユーザーの名前を指定
Group=ubuntu # 実行するサーバーグループの名前を指定
WorkingDirectory=/path/to/django/app # django project へのpathを指定
ExecStart=/path/to/gunicorn -w 3 -b 127.0.0.1:8000 {#djangoappname#}.wsgi # gunicornによる起動コマンド

[Install]
WantedBy=multi-user.target

ファイルの中身を簡単に説明します。

djangoは、gunicornというWSGIサーバーを使って起動します。
したがって、gunicornでdjangoを起動するためのコマンドをExecStartに指定します。

このとき、djangoを起動するIPアドレスやapp nameは任意で設定して下さい。

注意点としては、gunicornをフルパスで指定することです。(ExecStart=path/to/gunicornの部分)

/path/to/gunicornに指定するフルパスは、以下のコマンドで取得できる値を設定すれば大丈夫です。

which gunicorn

ここまでの作業が完了したらEsc -> :wqで内容を保存しvimを閉じましょう。

systemctlで自動起動有効化と設定

次に、initプロセスにおいて、上で作成したserviceファイルが読み込まれるように設定していきましょう。以下のsystemctlコマンドは、一行目で自動起動の有効化、二行目で起動をしています。

systemctl enable app
systemctl start app

appの部分は、serviceファイルの名前{app}.serviceのappの部分を任意で指定して下さい。

例えば、serviceファイル名をdjango.serviceと設定した場合、appをdjangoで置き換える必要があります。

その他のsystemctlコマンド

systemctlによる停止コマンド

sysmtemctl stop app

systemctlによる起動状態のステータスの取得は、

sysmtemctl status app

app.serviceファイルの中身をvimなどで修正した場合は、以下のコマンドで変更を反映することができます。

sysmtemctl daemon-reload

起動確認

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

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

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

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

★ここがポイント!

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

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

Djangoプログラミング
あれは魔法だろうか?
タイトルとURLをコピーしました