DjangoとuWSGI(http)とsystemdと永続化

Django

はじめに

今回は、引き続き下図のDjango部の環境を作ります。
DjangoをuWSGI経由でをsystemdで永続化するための方法を調べました。

環境

- Debian bullseye 64bit
- Django 4.2.5
- django-cors-headers 4.2.0
- djangorestframework 3.14.0
- uWSGI 2.0.22

pipenvによるPythonの仮想環境

「~/.bashrc」に追記します。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
export WORKON_HOME=~/.venvs
export PIPENV_VENV_IN_PROJECT=true

反映させます。

source ~/.bashrc

または

. ~/.bashrc

pyenvをアップデートするためのモジュールをインストールします。

git clone https://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update

pyenvで新しいバージョンのPythonを扱うためアップデートします。

pyenv update

必要なパッケージをインストールします。

sudo apt install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

インストール可能なPythonのリスト表示して、最新バージョンをインストールします。

pyenv install -l | grep '^  3\.[0-9]*\.[0-9]'
pyenv install 3.9.7
pyenv global 3.9.7
pyenv versions

仮想環境を作成するためにpyenv-virtualenvをインストールします。

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

pipenvでPythonの仮想環境を構築します。

sudo mkdir /home/www/backend
cd /home/www/backend
pip install pipenv
pipenv --python 3.9.7
pipenv shell
pip install --upgrade pip
pip install pipenv
pipenv install django
pipenv install uwsgi
pipenv install django-cors-headers
pipenv install djangorestframework

Djangoの設定ファイルとアプリを作成します。

cd /home/www/backend
django-admin startproject config .
django-admin startapp app

python manage.py makemigrations
python manage.py migrate

sudo -R chown www-data. /home/www/backend

Django管理画面の管理者ユーザを作成します。

cd /home/www/backend
python manage.py createsuperuser

UWSGIの設定ファイルの編集

127.0.0.1(ローカルループバックアドレス)以外にIPアドレスを持っている場合は「http」で追加します。
追加しないとサーバ以外のパソコンからアクセスできません。
Djangoの管理画面に外部からもアクセスしたいので指定しています。
外部からアクセスする場合はWebブラウザで「http://192.168.10.2:8000」にアクセスします。

「config.wsgi:application」の「config」は上記の「django-admin startproject config .」で指定した名前になります。
今回は「config」です。

設定ファイル名はuwsgi.iniとします。

cd /home/www/backend
sudo vi uwsgi.ini

processes、threadsなどは適当な数値に修正します。
また、Djangoの管理画面のレイアウトが崩れないようにするに以下の3個の方法がありますが、今回は「1」を使います。
 1. uwsgi.iniで「static-map2」を使ってstaticディレクトリを指定する。
 2. Nginxでリバースプロキシを作り、設定ファイルでadmin用のstaticディレクトリを指定する。
 3. collectstaticを実行して、settings.pyでSTATIC_ROOTとSTATIC_URLを適切に設定する。

「static-map2」の詳細は公式サイトをご参照ください。

Serving static files with uWSGI (updated to 1.9) — uWSGI 2.0 documentation
 [uwsgi]
chdir  = /home/www/backend
module = config.wsgi:application
home   = .venv
master = true

py-autoreload = 1
die-on-term   = true

enable-threads = true

processes    = 1
threads      = 1
max-requests = 5000
buffer-size  = 65536

uid = www-data
gid = www-data

# Django管理画面のstaticディレクトリを指定する。
static-map2 = /static/admin=/home/www/backend/.venv/lib/python3.11/site-packages/django/contrib/admin

#
# http
#
http = 127.0.0.1:8000
http = 192.168.10.2:8000

# Log
#logto     = uwsgi.log
#deamonize = uwsgi-@(exec://date +%Y-%m-%d).log
#daemonize = uwsgi-daemon.log
#log-reopen = true

#
# socket
# Reverse Proxy Nginx or Apache
#
#socket       = /run/backend/uwsgi-backend.sock
#chmod-socket = 666
#pidfile      = /run/backend/uwsgi-backend.pid
#vacuum       = true

uWSGIをsystemdから自動起動するための設定ファイル

uWSGIをsystemdから自動起動するための設定ファイルするファイルを作成します。

sudo vi /etc/systemd/system/uwsgi-backend.service

ファイル内容は下記の通りです。

[Unit]
Description = uWSGI Backend
After = syslog.target

[Service]
ExecStart = /home/www/backend/.venv/bin/uwsgi --ini /home/www/backend/uwsgi.ini
Restart = always
#KillSignal = SIGQUIT
#Type = notify
StandardError = syslog
#NotifyAccess = all

[Install]
WantedBy = multi-user.target

OSの起動時に自動起動するように設定します。

sudo systemctl enable uwsgi-backend
sudo systemctl is-enabled uwsgi-backend
sudo systemctl daemon-reload
sudo systemctl start uwsgi-backend
sudo systemctl status uwsgi-backend

Django REST frameworkとdjango-cors-headersの設定

Djangoのsettings.pyに追加します。

INSTALLED_APPS = [
  ・・・・・(省略)
  'corsheaders',    # django-cors-headers
  'rest_framework', # djangorestframework
]

MIDDLEWARE = [
  ・・・・・(省略)
  'corsheaders.middleware.CorsMiddleware', # django-cors-headers
  'django.middleware.common.CommonMiddleware',
  ・・・・・(省略)
]

uWSGIを再起動します。

sudo systemctl restart uwsgi-backend
Home - Django REST framework
Django, API, REST, Home
django-cors-headers
django-cors-headers is a Django application for handling the server headers required for Cross-Origi...

Webブラウザでアクセスしてみる

以下のようにコマンドを実行してから、Webブラウザで「http://192.168.10.2:8000/admin」にアクセスするとDjangoの管理画面が表示されます。

Comments