Django \[Errno 13\] 权限被拒绝:'/var/www/media/animals/user_uploads'

新手上路,请多包涵

我正在开发一个 django API,它将在运行 Ubuntu 的服务器上通过 WSGI 在 Apache2 之上运行。

用户将能够使用 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 错误

据我了解,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/

原文由 Vlad Schnakovszki 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 698
2 个回答

我最终自己解决了这个问题。

在开发机器上运行时,我实际上是使用当前用户的权限运行的。但是,在部署服务器上运行时,我实际上是通过 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这会打开安全漏洞

好的 解决方案是:

 sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 770 /var/www/

这会将 www-data 添加到 varwwwusers 组,然后将其设置为 /var/www/ 及其所有子文件夹的组。 You could set it to 750 to make it more secure but then you won’t be able to use Django's collectstatic functionality so stick to 770 除非你对自己正在做的事情非常有信心。

原文由 Vlad Schnakovszki 发布,翻译遵循 CC BY-SA 4.0 许可协议

在项目的根目录中创建一个“MEDIA”目录。然后设置:

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

原文由 Nic Scozzaro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题