【问题标题】:403 error with large media files on django server running nginx运行 nginx 的 django 服务器上的大型媒体文件出现 403 错误
【发布时间】:2017-11-29 22:56:32
【问题描述】:

我正在使用 Nginx 和 Gunicorn 运行托管在 DigitalOcean 上的 Django 服务器。当我遇到 403 错误时,我尝试通过管理界面添加 2MB 图片。查看error.log 表明权限被拒绝,如下:

2017/06/27 01:03:29 [error] 1643#1643: *30 open() "/home/brian/nydkc11/nydkc11/nydkcd11/media/image_main/dtc1.jpg" failed (13: Permission denied), client: 108.29.217.25, server: nydkc11.org, request: "GET /media/image_main/dtc1.jpg HTTP/1.1", host: "nydkc11.org", referrer: "http://nydkc11.org/admin/blog/image/7/change/"

然而,最奇怪的是,较小的图像文件也能正常工作(大约 18 kb 左右)。任何人都知道为什么较大的媒体文件可能会触发问题,以及我应该如何解决它?

我必须在我的nginx.conf 中将client_max_body_size 设置为100M,如果这对了解有用的话。

【问题讨论】:

  • 有一个 django 默认设置会导致大于 2.5 Mb 的文件流式传输到临时文件夹(而不是在内存中处理它们)。这可能是您的问题的原因。您的文件到底有多大,在您上传的大约 1-2 Mb 的文件中会发生什么?
  • 3MB。我没有上传 1 ~ 2MB 大小的文件,但 KB 范围内的文件可以正常工作。有什么办法可以更改默认设置?
  • 设置为DATA_UPLOAD_MAX_MEMORY_SIZE,默认值为2621440(即2.5Mb)。因此,如果您想将其调整为 10Mb,只需乘以 4。这适用于我部署到 Heroku 的项目。
  • 这无法解决问题。但最奇怪的是,在runserver 下上传相同的文件效果很好。

标签: django nginx gunicorn


【解决方案1】:

我刚刚遇到了完全相同的问题。感谢您的 SO 线程,否则我仍然会在错误的地方搜索。

要解决此问题,您实际上不需要设置DATA_UPLOAD_MAX_MEMORY_SIZE,只要您仅在上传文件时遇到此错误即可。 Django documentation 链接到另一个值,FILE_UPLOAD_MAX_MEMORY_SIZEhere

在我的settings.py 中将FILE_UPLOAD_MAX_MEMORY_SIZE 设置为更高的限制可以解决该问题,以及前面提到的nginx.conf 中的client_max_body_size

这会将上传最大值设置为大约200 MB

FILE_UPLOAD_MAX_MEMORY_SIZE = 200000000

【讨论】:

  • 这似乎是 Django 的 TemporaryFileUploadHandler 中的一个错误
【解决方案2】:

较大的文件(>2.5M)使用临时文件存储,默认情况下将获得 0o600 权限。通过将值设置为 FILE_UPLOAD_PERMISSIONS 可以轻松解决此问题

在 settings.py 中设置

FILE_UPLOAD_PERMISSIONS = 0o644

Reference

See For Python2

See Documentation

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2018-02-20
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多