it-roy-ru.com

Джанго [Errno 13] В доступе отказано: '/ var/www/media/animals/user_uploads'

Я разрабатываю Django API, который будет работать поверх Apache2 через WSGI на сервере под управлением Ubuntu. 

Пользователи смогут загружать свои снимки на сервер, используя запрос 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-данные: х: 33: 33: WWW-данные:/Var/WWW:/бен/ш

Я предполагаю, что это означает, что www-data имеет доступ ко всему в /var/www/. Я пытался: 

chmod 777 -R media

Это сработало, но это, очевидно, очень плохой способ решить эту проблему. Есть ли лучший способ решить эту проблему?

Это мой 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/
16
Vlad Schnakovszki

Я решил это сам в конце. 

Когда я работаю на компьютерах разработчиков, я на самом деле использую права текущего пользователя. Однако при работе на сервере развертывания я фактически использую wsgi, что означает, что он работает с привилегиями www-data.

www-data не является ни владельцем, ни в группе пользователей, которым принадлежит /var/www. Это означает, что www-data рассматривается как other и имеет права доступа, установленные для других.

ПЛОХОЕ решение этого было бы сделать:

Sudo chmod -R 777 /var/www/

Это дало бы всем полный доступ ко всему в /var/www/, что очень плохая идея .

Другим ПЛОХИМ решением было бы сделать:

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 предоставит владельцу права на чтение, запись и выполнение, но группа не сможет выполнить какой-либо сценарий, потенциально загруженный туда, если, например, веб-сервер был взломан. 

Вы можете установить его на 740, чтобы сделать его более безопасным, но тогда вы не сможете использовать функциональность Django'scollectstatic, поэтому придерживайтесь 760, если вы не очень уверены в том, что делаете.

49
Vlad Schnakovszki

У меня была похожая проблема в Django 1.10, и эта страница была первым результатом Google, но принятое решение не решило мою проблему. С каталогом 'MEDIA', расположенным в корне вашего проекта для хранения файлов, вам просто нужно установить:

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

и тогда я перестал получать ошибку. Я пробовал несколько вариантов, прежде чем обнаружил, что это работает. 

7
Nic Scozzaro

Чтобы узнать, к какому пользователю вы подключены:

$ whoami
ubuntu

И добавляя к вашему решению, если вы используете экземпляр AWS, вы должны добавить своего пользователя в группу, чтобы иметь доступ к этой папке:

Создание группы для пользователей веб-сервисов (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/

Добавить Ubuntu в группу varwwwusers

$ usermod -a -G varwwwusers ubuntu

Надеюсь это поможет!

4
Abdulla AlKhenji

Решением этой проблемы при работе с рабочим сервером было бы использование collectstatic, как уже упоминалось, что он использовал и разрешал, или предоставление разрешений для папок. Однако если ваше решение находится в локальной среде, его можно получить, настроив локальный каталог MEDIA в файле settings.py, который действует на локальном сервере.

Итак, добавим эти две строки в локальный файл конфигурации, как упомянуто @Nic Scozzaro:

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

После настройки перезапустите сервисы, чтобы применить исправления.

0
Lucas Coelho