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