web-dev-qa-db-ja.com

Django [Errno 13]許可が拒否されました: '/ var / www / media / animals / user_uploads'

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の両方を使用して、すべてがうまくいきました。展開サーバーでテストすると、次のエラーが表示されます。

Django Error

私の理解では、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/
17

私は最終的に自分でこれを解決しました。

開発マシンで実行する場合、実際には現在のユーザーの権限を使用して実行しています。ただし、展開サーバーで実行する場合、実際にはwsgiを介して実行しています。つまり、www-dataの特権を使用して実行しています。

www-dataは、/var/wwwを所有する所有者でもユーザーグループでもありません。これは、www-dataotherとして扱われ、許可が他に設定されていることを意味します。

これに対する[〜#〜] 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-datavarwwwusersグループに追加され、/var/www/およびそのすべてのサブフォルダーのグループとして設定されます。 chmodは、所有者に読み取り、書き込み、実行の許可を与えますが、たとえばWebサーバーがハッキングされた場合、グループはそこにアップロードされる可能性のあるスクリプトを実行できません。

これを740に設定してセキュリティを強化することはできますが、Django'scollectstatic機能を使用できないため、自分が何に自信があるかを除いて760に固執します再しています。

52

Django 1.10で同様の問題があり、このページは最初のGoogleの結果でしたが、受け入れられた解決策では問題は解決しませんでした。プロジェクトのルートにある 'MEDIA'ディレクトリファイルを保存するには、次の設定が必要です。

MEDIA_ROOT = os.path.join(BASE_DIR、 'MEDIA')

そして、エラーの表示を停止しました。これが機能することを発見する前に、私は多くのバリエーションを試していました。

7
Nic Scozzaro

ログオンしているユーザーを知るには:

$ whoami
ubuntu

ソリューションに追加し、AWSインスタンスを使用している場合は、そのフォルダーにアクセスできるようにユーザーをグループに追加する必要があります。

Webサービスユーザー(varwwwusers)のグループを作成する

$ Sudo groupadd varwwwusers

Wwwフォルダーを変更し、varwwwusersに属するようにします

$ Sudo chgrp -R varwwwusers /var/www/

www-dataは、Djangoリクエストを作成するサーバーです。グループに追加します

$ Sudo adduser www-data varwwwusers

フォルダーポリシーの変更

$ Sudo chmod -R 770 /var/www/

VarwwwusersのグループにUbuntuを追加します

$ usermod -a -G varwwwusers ubuntu

お役に立てれば!

4

本番サーバーを扱うときのこの問題の解決策は、既に述べたようにcollectstaticを使用して解決するか、フォルダーにアクセス許可を与えることです。ただし、ソリューションがローカル環境にある場合は、ローカルサーバー上で動作するsettings.pyファイルにローカルMEDIAディレクトリを構成することにより、ソリューションを取得できます。

したがって、@ Nic Sc​​ozzaroが述べたように、ローカル構成ファイルに次の2行を追加します。

MEDIA_ROOT = os.path.join (BASE_DIR, 'media')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')

構成後、サービスを再起動して修正を適用します。

0
Lucas Coelho