我正在开发一个 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。在部署服务器上进行测试时,我收到此错误:
据我了解,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 许可协议
我最终自己解决了这个问题。
在开发机器上运行时,我实际上是使用当前用户的权限运行的。但是,在部署服务器上运行时,我实际上是通过
wsgi
运行的,这意味着它正在使用www-data
的权限运行。www-data
既不是所有者,也不是拥有/var/www
的用户组。这意味着www-data
被视为other
并将权限设置为其他。对此的 坏 解决方案是:
这将使每个人都可以完全访问
/var/www/
中的所有内容, 这是一个非常糟糕的主意。另一个 不好 的解决方案是:
这会将所有者更改为
www-data
, 这会打开安全漏洞。好的 解决方案是:
这会将
www-data
添加到varwwwusers
组,然后将其设置为/var/www/
及其所有子文件夹的组。 You could set it to750
to make it more secure but then you won’t be able to useDjango's
collectstatic
functionality so stick to770
除非你对自己正在做的事情非常有信心。