Nginx + uWSGI + Djangoのwebアプリケーション環境を作る (その2)

Django

第2回 uWSGIの設定とNginx連携

第1回ではDjangoプロジェクトとアプリケーションを作成するところまで行いましたが、今回はuWSGIを使用してNginxと連携し、ウェブブラウザから管理ページを表示させるまでの手順を紹介します。

venv環境をロード

前回DjangoをインストールしたPythonのvenv環境をロードする。前回からの続きで既にロード済みの場合は不要。

$ cd demo
$ source .venv/bin/activate
(.venv)$

uWSGIに必要なパッケージをインストール

uWSGIをインストールする際に、内部でgccでのcソースコンパイルが行われる。そのため、gccとpythonのdevelopパッケージをインストールしておく。
※ これはvenv環境ではなくOS環境全体に対する操作。

(.venv)$ sudo dnf install gcc python36-devel

uWSGIのインストール

uWSGIをインストールする前に、uWSGIで必要になるwheelパッケージをvenv環境にインストールする。uWSGIと同時にインストール指定するとwheelパッケージが先にインストールされない場合があるため、個別に入れる。

(.venv)$ pip install wheel

venv環境にuWSGIをインストールする。

(.venv)$ pip install uwsgi

uWSGIの設定

PIDとソケットファイルの場所を作成

uWSGIをデーモンとして動作させ、またNginxとソケットファイルで連携するため、PIDファイルとソケットファイルを置く場所を作成する。
どちらのファイルもuWSGIが動作する際に新規作成され、停止していない時は不要であることと、高速なアクセスが必要であるため、RAMディスクである/run/demo配下に置くことにする。
uWSGIのワーカープロセスは一般ユーザで動作させるため、適切なパーミッションをディレクトに与える。また、Nginxのワーカープロセスもアクセスするため、同様にパーミッションを考慮する。
ここでは、uWSGIのワーカープロセスをユーザhiyoko、Nginxのワーカープロセスをグループwww-usersで実行することを前提にしている。

(.venv)$ sudo mkdir -p /run/demo
(.venv)$ sudo chown hiyoko:www-users /run/demo
(.venv)$ sudo chmod 750 /run/demo

uwsgi.iniの作成

uwsgiはそのままコマンド起動可能だがオプション指定が多数あって手間がかかるため、Djangoのプロジェクトディレクトリにuwsgi.iniというファイルを作成してそれを指定する。以下は今回の設定内容。

[uwsgi]
chdir            = /home/hiyoko/demo
module           = demo.wsgi:application
pidfile          = /run/demo/demo.pid
socket           = /run/demo/demo.sock
home             = /home/hiyoko/demo/.venv
daemonize        = /home/hiyoko/demo/demo.log
uid              = hiyoko
gid              = www-users

master           = true
processes        = 5
harakiri         = 30
max-requests     = 5000
vacuum           = true

disable-logging  = true
log-4xx          = false
log-5xx          = true

env DJANGO_SETTINGS_MODULE = demo.settings

uWSGI.iniの内容は公式ドキュメントに定義があるが、非常に分かりづらい。
以下は今回設定した内容。ここでのプロジェクト名は、ディレクトリ名ではなく django-admin startproject <プロジェクト名> . で指定した名前。

パラメータ説明
chdirこのディレクトリに移動してuWSGIを実行する。
moduleDjangoは <プロジェクト名>.wsgi.application クラスが実行のエントリポイントとなるため、<プロジェクト名>.wsgi:application を指定。
pidfileuWSGIのルートプロセスが作成するPIDファイルのパス。
socketuWSGIがNginxと連携するソケットファイルのパス。
homePythonのホームディレクトリ。venv環境の場合はvnevディレクトリ。
daemonizeuWSGIをデーモンモードで動かす場合のログファイル。
uiduWSGIのワーカープロセスのユーザ。
giduWSGIのワーカープロセスのグループ。
masterマスタープロセスからワーカーを起動する。
processesワーカープロセスの数。
harakiri無応答が続いたプロセスをkillするまでの秒数。
max-requestsプロセスを再起動するまでのリクエスト数。メモリリーク等での膨張回避用。
vacuumプロセス終了時にソケット等の生成ファイルを掃除する。
disable-loggingリクエスト毎にログ記録しない。
log-4xxHTTP STATUS 4xxのエラーをログに記録する。
log-5xxHTTP STATUS 5xxのエラーをログに記録する。
env DJANGO_SETTINGS_MODULEDjangoの設定を読み込む。Django側にある <プロジェクト名>/wsgi.py の内容と合わせる。

Nginxの設定

実行ユーザの設定

NginxからuWSGIのソケットファイルにアクセスできるよう、適切な実行ユーザ (グループ) の設定を行う。設定はnginx.confのuserディレクティブで行う。
ここでは、ソケットファイルと配置ディレクトリにwww-usersグループのアクセス権を与えているため、Nginxの実行グループをwww-usersにする。

(.venv)$ sudo vi /etc/nginx/nginx.conf

userディレクティブの設定内容

user  nginx www-users;

リバースプロキシの設定

NginxがuWSGIのソケットファイルを通じてDjangoプロジェクトと連携するよう、URLパスのリバースプロキシ設定を行う。URLパスの定義はnginx.confのserverディレクティブ内にあるが、バージョンによっては別ファイルに分けてそれをnginx.conf内でインクルードしている場合があるため、適宜判断すること。
ここでは、ルート "/" のURLパスに対してソケットファイルを指定する。

(.venv)$ sudo vi /etc/nginx/conf.d/default.conf

default.confの設定内容

    location / {
        include    uwsgi_params;
        uwsgi_pass unix:/run/demo/demo.sock;
    }

Nginx再起動

設定を変更したら、シンタックスの確認を行ったうえでNginxを再起動する。

(.venv)$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
(.venv)$ sudo systemctl restart nginx

起動スクリプト作成

uWSGI + Djangoを起動するために毎回venv環境をロードしたりPIDファイルの配置場所を作成することは手間がかかるため、Djangoプロジェクトディレクトリ内にstart.shという起動スクリプトを作成する。ファイルは実行権限を与えること。以下がスクリプトの内容。

#!/bin/bash

RUN_DIR=/run/demo
USER_ID=hiyoko
GROUP_ID=www-users

if [ ! `id -un` = "root" ]; then
  echo This service must be run by root.
  exit 1
fi

mkdir -p $RUN_DIR
chown $USER_ID:$GROUP_ID $RUN_DIR
chmod 750 $RUN_DIR

SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd $SCRIPT_DIR
source .venv/bin/activate
uwsgi --ini $SCRIPT_DIR/uwsgi.ini
deactivate

uWSGI + Djangoプロジェクトの起動

作成したstart.shを、root権限で起動する。

(.venv)$ sudo ./start.sh
[uWSGI] getting INI configuration from /home/hiyoko/demo/uwsgi.ini

プロセスが立ち上がっていることを確認する。
なお、プロセスを終了したい場合は kill -SIGQUIT <いちばん若いプロセスID> を実行する。

(.venv) ps auxww | grep uwsgi | grep -v grep
hiyoko      1898  0.6  0.8 386828 33760 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
hiyoko      1900  0.0  0.6 386828 25084 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
hiyoko      1901  0.0  0.6 386828 25084 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
hiyoko      1902  0.0  0.6 386828 25084 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
hiyoko      1903  0.0  0.6 386828 25084 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
hiyoko      1904  0.0  0.6 386828 25084 ?        S    12:55   0:00 uwsgi --ini /home/hiyoko/demo/uwsgi.ini

PIDファイルとソケットファイルが作成されているか確認する。

(.venv)$ ls -la /run/demo
合計 4
drwxr-x---  2 hiyoko www-users  80  8月 10 12:55 .
drwxr-xr-x 24 root   root      700  8月 10 12:40 ..
-rw-rw-rw-  1 root   root        5  8月 10 12:55 demo.pid
srwxrwxrwx  1 hiyoko www-users   0  8月 10 12:55 demo.sock

Djangoはデフォルトで管理ページを持っている。ウェブブラウザでDjangoの管理ページを表示して動作しているか確認する。ログイン画面が表示されれば、Djangoが正常に動作していると判断できる。
http://<サーバのIPアドレス>/admin/ で管理ログイン画面を表示する。

コメント

  1. […] 第2回と重複するパラメータも記載するが、ログ関連の設定内容を以下に列挙する。実際に変更・追加したのは、ログファイルのパスを /var/log/demo 配下に変更するための daemonize と、ログローテート関連の logfile-chown および touch-logreopen となる。 […]

タイトルとURLをコピーしました