Ubuntuを実行しているサーバー上のWSGIを介してApache2の上で実行されるDjango APIを開発しています。
ユーザーはPOSTリクエストを使用して、撮影した写真をサーバーにアップロードできます。APIはこのリクエストを処理し、/var/www/media/animals/user_uploads/<animal_type>/<picture_name>.jpg
に画像を書き込もうとします。ディレクトリ/var/www/media/animals/user_uploads/<animal_type>/
で作成されます。
開発中にテストするとき、WindowsとScientific Linuxの両方を使用して、すべてがうまくいきました。展開サーバーでテストすると、次のエラーが表示されます。
私の理解では、Apache2サーバーはユーザーwww-data
を使用して実行されています。私の場合、cat /etc/passwd
を実行してユーザーのリストを取得しますが、これはwww-data
で取得するものです。
www-data:x:33:33:www-data:/ var/www:/ bin/sh
これは、www-data
が/var/www/
のすべてにアクセスできることを意味すると想定しています。私が試してみました:
chmod 777 -Rメディア
これは機能しましたが、これは明らかにこれを解決するのに非常に悪い方法です。これを解決するより良い方法はありますか?
これは私のwsgi.pyです:
import os, sys
os.environ.setdefault("Django_SETTINGS_MODULE", "serengeti.settings")
sys.path.append('/serengeti/Django/serengeti')
sys.path.append('/serengeti/Django')
from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
私のsettings.py
ファイルにこれがあります:
MEDIA_ROOT = '/var/www/media/'
MEDIA_URL = os.path.join(BASE_DIR,'/media/')
私のvhost.conf
には次のものが含まれます。
Alias /media/ /var/www/media/
私は最終的に自分でこれを解決しました。
開発マシンで実行する場合、実際には現在のユーザーの権限を使用して実行しています。ただし、展開サーバーで実行する場合、実際にはwsgi
を介して実行しています。つまり、www-data
の特権を使用して実行しています。
www-data
は、/var/www
を所有する所有者でもユーザーグループでもありません。これは、www-data
がother
として扱われ、許可が他に設定されていることを意味します。
これに対する[〜#〜] bad [〜#〜]解決策は次のとおりです。
Sudo chmod -R 777 /var/www/
これにより、誰もが/var/www/
のすべてに完全にアクセスできるようになります これは非常に悪い考えです 。
別の[〜#〜] bad [〜#〜]解決策は次のとおりです。
Sudo chown -R www-data /var/www/
これにより、所有者がwww-data
、 セキュリティの脆弱性を開く に変更されます。
[〜#〜] good [〜#〜]ソリューションは次のようになります。
Sudo groupadd varwwwusers
Sudo adduser www-data varwwwusers
Sudo chgrp -R varwwwusers /var/www/
Sudo chmod -R 760 /var/www/
これにより、www-data
がvarwwwusers
グループに追加され、/var/www/
およびそのすべてのサブフォルダーのグループとして設定されます。 chmod
は、所有者に読み取り、書き込み、実行の許可を与えますが、たとえばWebサーバーがハッキングされた場合、グループはそこにアップロードされる可能性のあるスクリプトを実行できません。
これを740
に設定してセキュリティを強化することはできますが、Django's
collectstatic
機能を使用できないため、自分が何に自信があるかを除いて760
に固執します再しています。
Django 1.10で同様の問題があり、このページは最初のGoogleの結果でしたが、受け入れられた解決策では問題は解決しませんでした。プロジェクトのルートにある 'MEDIA'ディレクトリファイルを保存するには、次の設定が必要です。
MEDIA_ROOT = os.path.join(BASE_DIR、 'MEDIA')
そして、エラーの表示を停止しました。これが機能することを発見する前に、私は多くのバリエーションを試していました。
ログオンしているユーザーを知るには:
$ whoami
ubuntu
ソリューションに追加し、AWSインスタンスを使用している場合は、そのフォルダーにアクセスできるようにユーザーをグループに追加する必要があります。
$ Sudo groupadd varwwwusers
$ Sudo chgrp -R varwwwusers /var/www/
$ Sudo adduser www-data varwwwusers
$ Sudo chmod -R 770 /var/www/
$ usermod -a -G varwwwusers ubuntu
お役に立てれば!
本番サーバーを扱うときのこの問題の解決策は、既に述べたようにcollectstaticを使用して解決するか、フォルダーにアクセス許可を与えることです。ただし、ソリューションがローカル環境にある場合は、ローカルサーバー上で動作するsettings.py
ファイルにローカルMEDIA
ディレクトリを構成することにより、ソリューションを取得できます。
したがって、@ Nic Scozzaroが述べたように、ローカル構成ファイルに次の2行を追加します。
MEDIA_ROOT = os.path.join (BASE_DIR, 'media')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')
構成後、サービスを再起動して修正を適用します。