スクリプトのお勉強 技術

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

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

執筆者:

関連記事

seaborn + Pandas + Python によるグラフ描画(その1: 準備編)

グラフ描画してみよう 今現在の仕事で、グラフ描画する可能性があるので、少し練習してみようと思います。 題材について 突然ですが、私は確定拠出型年金に加入しています。証券会社はSBI証券 にしています。 …

Svelte(Carbon Components Svelte) + Python(FastAPI)でWebアプリを作る

Svelte用のサンプルとして、Carbon Components SvelteのTreeViewを試用してファイルツリーを表示し、各データはAPIとして読み出し、編集するWebアプリケーションを実装 …

Vue.js 導入編

1.はじめに 近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。 「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは …

Nuxt.js + Element + Responderでのtableサンプル作成

1. はじめに 最近、Webアプリケーションを作成する仕事が、少しずつですがあります。その際に使用するのは、殆どの場合「テーブル」です。 素のtableタグを駆使して作成した場合、テーブル内のセルにも …

gradleのcommandLineでリダイレクト

gradleというビルドツールがあります。なぜかRPMを作成するのに使ってます。Ansibleも使ってるんですがね。。 それはともかく、ここの通りなのですが、例えばls -lRの出力を、プロジェクトデ …

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