スクリプトのお勉強 技術

CentOS7 + Django2.2 + uwsgi + nginx 連携方法

投稿日:

Djangoとnginx連携方法

以前はApache経由で連携しましたが、今回はnginxと連携する方法を記述します。

環境

設定した環境は以下です。

  • OS: CentOS7
  • Python3.6.8 (epelからインストール)
  • Django: 2.2.3
  • uWSGI: 2.0.18

構成

構成は以下になります。

ブラウザ <-> nginx <-> socket <-> uwsgi <-> Django

socketは、/run/uwsgi/django_upload.sockに設定しています。

設定内容

それぞれの設定を行います。

nginx

既存のnginx設定があるので、その設定に追加する形で行います。

server {

  #ここを追記
  location ~ ^/django_upload/(.*)$ {
    location ~ ^/django_upload/static {
      root /opt/webapps;
    }
    location ~ ^/django_upload/media  {
      root /opt/webapps;
    }

    rewrite ^/django_upload/(.*) /$1  break;
    uwsgi_pass unix:///run/uwsgi/django_upload.sock;
    include uwsgi_params;
  }
}

上記の設定をした場合、mediaのディレクトリは、以下に置く必要があります。

/opt/webapps/django_upload/media

githubに置いたのはそのようになっていないので、以下のようにリンクを張る必要があります。
mediaは、public/mediaに設定してあります。

$ ln -s /opt/webapps/django_upload/public/media /opt/webapps/django_upload/media

Djangoアプリの起動準備

Djangoアプリはここにあります。

Djangoアプリの起動準備は以下です。Djangoアプリは/opt/webapps/django_uploadに置く前提です。

$ sudo mkdir -p /opt/webapps
$ sudo cp -r django_upload/ /opt/webapps
$ sudo -i
$ cd /opt/webapps/django_upload
$ export PIPENV_VENV_IN_PROJECT=1
### pipenvにパスを通す
$ export PATH="/usr/local/bin:$PATH"
$ pipenv install
$ mkdir log
$ cd .. ; chown -R nginx:nginx django_upload

uwsgi

uwsgi.iniは、/opt/webapps/django_upload/config/uwsgi.iniに置きます。上記の手順で置かれます。

[uwsgi]
socket = /run/uwsgi/django_upload.sock
chdir = /opt/webapps/django_upload
master = true
processes = 4
max-requests = 1000
harakiri = 30
post-buffering = 8192
logto = log/uwsgi.log
pidfile = /run/uwsgi/django_upload.pid
reaper = true
disable-logging = false
chmod-socket = 666
env = DJANGO_SETTINGS_MODULE=django_upload.settings.production
module = django_upload.wsgi
pythonpath = /opt/webapps/django_upload
mount = /django_upload_hosting=django_upload/wsgi.py
manage-script-name = true

Djangoアプリの自動起動

以下のファイルを生成して、systemdでDjangoアプリを自動起動する設定を行います。

/etc/systemd/system/django_upload.service

[Unit]
Description=uWSGI instance to Django app

[Service]
ExecStart=/usr/local/bin/pipenv run uwsgi --ini config/uwsgi.ini
PIDFile=/run/uwsgi/django_upload.pid
ExecStop=/usr/local/bin/pipenv run uwsgi --stop /run/uwsgi/django_upload.pid
Restart=always
WorkingDirectory=/opt/webapps/django_upload
EnvironmentFile=/etc/sysconfig/django_upload
User=nginx
Group=nginx

[Install]
WantedBy=multi-user.target

/etc/sysconfig/django_uploadは環境変数を読み込むファイルです。
以下の内容にしてください。SECRET_KEYは必須です。XXXXXXXXを任意の値にしてください。

SECRET_KEY="XXXXXXXXX"

“XXXXXXXXX”は、以下のワンライナーで出力した値を設定すると安全です。

$ /usr/local/bin/pipenv run python3 -c "from django.core.management.utils import get_random_secret_key ; print(get_random_secret_key())"

起動は以下で行います。

$ sudo touch /etc/systemd/system/django_upload.service
$ sudo chmod 644 /etc/systemd/system/django_upload.service
$ mkdir -p /run/uwsgi; chown nginx:nginx /run/uwsgi
### 上記の内容をdjango_upload.serviceに格納します
$ sudo systemctl enable django_upload.service
$ sudo systemctl start django_upload
$ sudo systemctl status django_upload
### nginx.confの修正を反映
$ sudo systemctl restart php-fpm
$ sudo systemctl restart nginx

アップロード画像の後始末

忘れがちですが、このままですと、アップロードディレクトリ(/opt/webapps/django_upload/public/media)に画像が残り続けるので、
3日ぐらい経過したら削除したほうがいいと思います。

cronか、systemd timerか何かに指定しておきましょう。

参考

https://qiita.com/takahirono7/items/fd6f9239f0f88eb65a7c

-スクリプトのお勉強, 技術

執筆者:

関連記事

Rustのお勉強をしてみる(XMLRPCクライアント編)

なんとなく手付かずだったので、Rustの勉強をしてみようと思います。 手始めとして、なぜかXMLRPCクライアントを作ってみます。 環境 WSL2 Ubuntu 22.04 LTS Rustインストー …

Pipenvでライブラリ(*.whl)をキャッシュする方法

仕事でWebアプリケーションを作成した場合、ガンガンとライブラリのバージョンを上げたりはしない場合があります。 そして、長期間放置されるタイプのWebアプリケーションの場合、使用しているライブラリが、 …

Go言語でtarアーカイブコマンド作成

今所属している会社で1バイナリでとりあえず済ませる簡単ツールはgo言語で書くことが多いようです。 私はそれほどgo言語が好きというわけでもありませんが、勉強がてら、ディレクトリからtarアーカイブする …

Python3 – django-webtest

忙しいので断片だけ。。 DjangoでWebブラウザからアクセスする感じでテストする、やり方の一つです。以前にやったように、 Seleniumからやってもいいのすが、そこまでじゃない場合の単体テスト方 …

小ネタ – Python3 でIPv4アドレスの第三オクテットを加算する方法

ホント小ネタです。IPv4アドレスの第四オクテットは単に加算すればいいですが、第三オクテットを加算する方法が見つかりませんでした 通常はしないのかもしれませんが、、そして残念ながら、いい方法がありませ …

google オプトアウト Click here to opt-out.