【问题标题】:Django File Upload with nginx / gunicorn - media permissions使用 nginx / gunicorn 上传 Django 文件 - 媒体权限
【发布时间】:2014-10-20 00:17:35
【问题描述】:

我正在尝试允许我的 django 站点的用户通过模型上的 FileField 将文件(主要是 PDF)上传到我的服务器。但是,在尝试使用我的模型表单生成的上传字段时,我一直遇到“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) 之外的目录中正确收集和提供服务,因此我尝试将媒体文件夹移到那里并重复上述所有步骤 - 结果相同.

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

谢谢!

【问题讨论】:

标签: python django nginx gunicorn


【解决方案1】:

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

server {
    ...

    client_max_body_size 250M;

    ...
}

默认情况下,它设置为 1M,这可能太小,具体取决于您上传的内容。

【讨论】:

    【解决方案2】:

    首先,媒体文件夹必须在你的项目路径中,否则你会得到 Django 的 SuspiciousOpertion 异常,所以不要把它放在 /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

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

    【讨论】:

    • 任何备份到文件系统根目录的父目录也需要至少可由运行代码的同一用户搜索。如果上传目录的父目录不可搜索,那么它仍然可以看到上传文件夹。还要检查 SELinux 扩展是否可能导致问题。
    • 我感觉整个世界的重量都从我肩上卸下了。谢谢!
    • 我应该将媒体文件夹所有者设置为什么?我正在使用 gunicorn 和 nginx。
    • 我迟到了好几个月,但您应该设置媒体文件夹的所有者以匹配运行您的 django 进程的用户。
    猜你喜欢
    • 2017-08-07
    • 2016-04-14
    • 2017-11-18
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2018-01-28
    相关资源
    最近更新 更多