使用nginx / gunicorn进行Django文件上传 - 媒体权限

时间:2014-08-26 15:35:26

标签: python django nginx gunicorn

我试图让我的django网站的用户通过模型上的FileField将文件(主要是PDF)上传到我的服务器。但是,我一直遇到“拒绝错误”#13; 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,那么所有内容和#34;都可以正常工作。 - 但是出于显而易见的原因,这不是我想要曝光的事情。

我的静态文件正在从我的项目根目录(/ var / www / mysite / static)之外的目录中收集和正确提供,所以我尝试在那里移动媒体文件夹并重复上述所有步骤 - 相同的结果。

如何让我的媒体文件夹安全地接受用户的上传和下载,而不会让这个安全漏洞全开?

谢谢!

2 个答案:

答案 0 :(得分:3)

首先,媒体文件夹必须在你项目的路径中,否则你将从Django获得 SuspiciousOpertion 例外,所以不要把它放在 / var / www中

另外,你使用nginx的事实并不那么重要,重要的部分是哪个用户是nginx / django项目正在运行,无论用户是谁(通常 www-data ,at至少使用 apache + mod_wsgi ),该用户应该是媒体文件夹的所有者。

将所有者更改为正确的用户(我假设 www-data ):sudo chown -R www-data:www-data .../media,请确保权限正确:sudo chmod -R u+rwX .../media

希望它有所帮助。如果没有,请告诉我。 :)

答案 1 :(得分:2)

尝试在nginx配置文件中增加max_body_size

server {
    ...

    client_max_body_size 250M;

    ...
}

默认设置为 1M ,根据您上传的内容,这可能太小。