У меня есть сайт django, работающий на Ubuntu с apache2, настроенным с помощью mod_wsgi. В media
(папка, в которую загружаются файлы, загруженные пользователем) принадлежит пользователю ubuntu (с доступом sudo) и группе media
папка www-data
. Когда новая папка или файлы создаются apache в папке мультимедиа, какой-либо внешний процесс Python (например, subprocess.popen
) не может писать в эту папку, поскольку эта конкретная папка принадлежит www-data
. Какое решение этой проблемы?
Что я сделал до сих пор (django
является пользователем системы):
sudo chown django:django -R mysite/media/
sudo chgrp -R www-data mysite/media/
sudo chmod -R g+w mysite/media/
ls -la
Результат media
папка (медиа-папка содержит несколько других папок с целыми числами):
drwxr-sr-x 2 www-data www-data 4096 Jun 8 02:20 11
drwxrwsr-x 6 django www-data 4096 Jun 7 18:15 10
drwxrwsr-x 5 django www-data 4096 Jun 7 18:13 9
drwxrwsr-x 5 django www-data 4096 Jun 7 18:11 8
Как видите, недавно созданная папка 11
принадлежит www-data
не по django
пользователь.
Что еще я пробовал:
django
к www-data
группа но ничего не помогаетПожалуйста помоги!
Обновить
К сожалению Daniel
решение также не работает для меня (все еще получаю IOError: [Errno 13] Permission denied
). Вот результат команды getfacl mysite/site_media/
:
Перед
# file: mysite/site_media/
# owner: django
# group: www-data
user::rwx
group::rwx
other::r-x
После (sudo setfacl -d -R -m g:www-data:rwx mysite/site_media/
)
# file: mysite/site_media/
# owner: django
# group: www-data
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:www-data:rwx
default:mask::rwx
default:other::r-x
Проблема была в общей памяти. это ответ помог это исправить.
Добавление none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0
в /etc/fstab
починил это.
Вы можете использовать списки контроля доступа к файлам, в этом случае setfacl
для установки разрешения файла по умолчанию, чтобы разрешить операцию записи для группы. Если вы добавили django в группу www-data, то с помощью следующей команды пользователь django получит разрешение на запись в любые файлы, принадлежащие пользователю www-data.
setfacl -d -R -m g:www-data:rwx mysite/media/
Примечание: вам нужно будет установить acl
пакет с использованием apt-get install acl
если он не установлен. Убедитесь, что для вашего раздела также включен ACL - эта ссылка может помочь.
Я не полностью понимаю ваше описание проблемы, но думаю, что проблема в том, что он установил бит, т.е. 's' в:
drwxr-sr-x
Посмотри на: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories для описания написано лучше, чем я могу дать. В chmod
страницу руководства тоже. В основном информацию ищите в сетгуде. Он ведет себя с каталогами иначе, чем с файлами.
Пытаться chmod g-s
в медиа-каталоге, а затем создайте подкаталог в медиа и посмотрите, помешало ли это ему унаследовать неправильные разрешения. Если это так, вам просто нужно удалить бит setgid из всех других поддиректорий.
Для этого find
ваш друг (может искать по группам владельцев и завивки)
Посмотрев на вывод вашего каталога, на разрешения каталога 11
если быть точным, я обнаружил, что apache создал его с правами на чтение группы, но не с правами записи группы. Поскольку вы можете захотеть, чтобы все пользователи в группе www-data
чтобы иметь права на запись для этих файлов / каталогов, вам необходимо указать apache для создания файлов / каталогов с разрешениями групповой записи, которые можно выполнить, установив umask
возможность WSGIDaemonProcess. Поскольку в документации говорится:
Обычно унаследованная маска umask будет
0022
у вас всегда не будет установленных разрешений на запись для группы. Все, что вам нужно в этом случае, это просто установить значение umask на 0002
и перезапустите apache. Вы можете решить эту проблему, просто запустив WSGIDaemon как пользователь django
указав соответствующее имя пользователя.