Django文件上传与nginx/gunicorn - 媒体权限
我正在尝试让我的Django网站用户通过模型中的FileField上传文件(主要是PDF)到我的服务器。但是,当我使用我的modelform生成的上传字段时,总是遇到“Errno 13 Permission Denied”的错误。
我在网上找到了很多可能的解决方案,但到目前为止都没有成功。这是我第一次真正部署项目,可能搞得有些混乱。作为参考,我使用的是Ubuntu 14.04,Django 1.6,以及gunicorn和nginx。
现在,我的媒体文件根目录位于我的项目目录下:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(BASE_DIR, "media/uploads")
这个错误表明目录设置有问题,所以文件是去对的地方了。
我尝试用 chown -r
命令把媒体目录的所有者改成 www-data:www-data
,但没有成功。我查了一下,发现是哪个用户在运行Python进程,然后试着把这个用户设置为所有者,但也没用。我又把它改回原来的所有者和组(root:root
),然后尝试用 chmod -r
设置权限为755和770,但这些方法也没能解决问题。
如果我用 chmod -r
设置为777,那一切“都能工作”——但显然我不想一直这样暴露。
我的静态文件已经正确地从项目根目录外的一个目录(/var/www/mysite/static)收集并提供服务,所以我尝试把媒体文件夹移动到那里,并重复上述所有步骤——结果还是一样。
我该如何让我的媒体文件夹安全地接受用户的上传和下载,而不留下明显的安全漏洞呢?
谢谢!
2 个回答
试着在你的nginx配置文件中把 max_body_size
的值调大:
server {
...
client_max_body_size 250M;
...
}
默认情况下,这个值是1M,这可能对你上传的内容来说太小了。
首先,媒体文件夹必须放在你项目的路径下,否则你会遇到SuspiciousOperation这个错误,Django会不高兴的。所以不要把它放在/var/www这个地方。
另外,你使用nginx这个事儿其实不太重要,关键是你的nginx或者Django项目是哪个用户在运行。通常这个用户是www-data,特别是在使用apache+mod_wsgi的时候。这个用户应该是媒体文件夹的拥有者。
一旦你把文件夹的拥有者改成正确的用户(我假设是www-data),你可以用这个命令:sudo chown -R www-data:www-data .../media
。然后确保权限设置正确,可以用这个命令:sudo chmod -R u+rwX .../media
。
希望这些信息对你有帮助。如果没有,请告诉我。:)