第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を実行する。 |
module | Djangoは <プロジェクト名>.wsgi.application クラスが実行のエントリポイントとなるため、<プロジェクト名>.wsgi:application を指定。 |
pidfile | uWSGIのルートプロセスが作成するPIDファイルのパス。 |
socket | uWSGIがNginxと連携するソケットファイルのパス。 |
home | Pythonのホームディレクトリ。venv環境の場合はvnevディレクトリ。 |
daemonize | uWSGIをデーモンモードで動かす場合のログファイル。 |
uid | uWSGIのワーカープロセスのユーザ。 |
gid | uWSGIのワーカープロセスのグループ。 |
master | マスタープロセスからワーカーを起動する。 |
processes | ワーカープロセスの数。 |
harakiri | 無応答が続いたプロセスをkillするまでの秒数。 |
max-requests | プロセスを再起動するまでのリクエスト数。メモリリーク等での膨張回避用。 |
vacuum | プロセス終了時にソケット等の生成ファイルを掃除する。 |
disable-logging | リクエスト毎にログ記録しない。 |
log-4xx | HTTP STATUS 4xxのエラーをログに記録する。 |
log-5xx | HTTP STATUS 5xxのエラーをログに記録する。 |
env DJANGO_SETTINGS_MODULE | Djangoの設定を読み込む。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/
で管理ログイン画面を表示する。
コメント
[…] 第2回と重複するパラメータも記載するが、ログ関連の設定内容を以下に列挙する。実際に変更・追加したのは、ログファイルのパスを /var/log/demo 配下に変更するための daemonize と、ログローテート関連の logfile-chown および touch-logreopen となる。 […]