我在 Ubuntu 上运行 django 网站,其中 apache2 配置了 mod_wsgi。media
(用户上传文件所在的文件夹)归 ubuntu 用户 (具有 sudo 访问权限) 所有,media
文件夹的组是www-data
。当 apache 在 media 文件夹中创建新文件夹或文件时,某些外部 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
答案1
您可以使用文件访问控制列表,在本例中setfacl
设置默认文件权限以允许组进行写操作。如果您已将 django 添加到 www-data 组,则使用以下命令,django 用户将对 www-data 用户拥有的任何文件具有写权限。
setfacl -d -R -m g:www-data:rwx mysite/media/
注意:如果未安装该包,则需要acl
使用该包进行安装。请确保您的分区已启用 ACL -apt-get install acl
此链接可能有帮助。
答案2
问题出在共享内存上。这答案帮助它解决了这个问题。
添加none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0
后就/etc/fstab
修复了。
答案3
通过查看目录输出,11
准确地说是查看目录的权限,我发现 apache 创建该目录时具有组可读权限,但没有组可写权限。由于您可能希望组中的所有用户都www-data
具有这些文件/目录的写权限,因此您需要告诉 apache 创建具有组写权限的文件/目录,这可以通过将umask
选项设置为WSGIDaemon进程. 因为文档说:
通常,继承的 umask 是
0022
您总是无法设置组可写权限。在这种情况下,您只需将 umask 值设置为0002
并重新启动 apache。您可以通过django
指定相关用户名以用户身份运行 WSGIDaemon 来解决此问题。
答案4
我不完全理解您对问题的描述,但我认为问题出在 setgid 位,即中的“s”:
drwxr-sr-x
看一下:http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories寻找比我能给出的更好的描述。chmod
手册页也是如此。基本上在 setgud 中查找信息。它在目录上的行为与在文件上的行为不同。
尝试chmod g-s
在媒体目录中,然后在媒体中创建一个子目录,看看这是否阻止了它继承错误的权限。如果已经阻止,您只需从所有其他子目录中删除 setgid 位。
因为那find
是你的朋友(它可以搜索所有者群组和权限)