スクリプトのお勉強 技術

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

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

執筆者:

関連記事

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

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

Pythonのmock.patchを使ってみる

単体テストによく使われるMockライブラリ Pythonで単体テストを行う際、実際のライブラリを使用してしまうと、実際の環境を用意しなければいけません。 例えば、データベースのテストをする際に、データ …

SimpleHTTPSAuthUploadServer というPython用モジュールを書いた

書いた動機 リモート開発になっているので、遠くのホストにあるファイルをお手軽に見たい、取ってきたいor編集したい、というニーズが、私の中であります。ftpなんか使わず、全部ブラウザでやりたいわけです。 …

pipenv + Apache + Django起動設定

仕事でwebアプリケーションを作成しています。 Djangoで作成し、webサーバをApache、環境をpipenvで設定したpython3環境上で動かす予定です。 Apacheが起動するまでに、苦労 …

最近の故障/修正物

近年で故障し、しょうがないから修理、というか購入したもの、及び顛末を書いてみます。 ハードディスク・レコーダー ちょっと前から調子が悪く、電源がつかなかったり、ついたと思ったら、録画物のリストがおかし …