Django 大文件上传超时怎么调整 Nginx 客户端超时设置

文章导读
调整 Nginx 的 client_max_body_size 和 proxy_read_timeout 参数,同时配合 Django 的 DATA_UPLOAD_MAX_MEMORY_SIZE 设置,可解决大文件上传超时或截断问题。适用场景为 Nginx 反向代理 Django 应用,风险边界在于过大的 body 限制可能增加服务器内存压力。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

调整 Nginx 的 client_max_body_size 和 proxy_read_timeout 参数,同时配合 Django 的 DATA_UPLOAD_MAX_MEMORY_SIZE 设置,可解决大文件上传超时或截断问题。适用场景为 Nginx 反向代理 Django 应用,风险边界在于过大的 body 限制可能增加服务器内存压力。

先说结论:Nginx 层需放行 body 大小和超时时间,Django 层需同步放宽限制。

  • 适合:Nginx+Gunicorn/uWSGI 架构
  • 先准备:备份配置文件 / 确认磁盘空间
  • 验收:用大文件实测上传流程

命令速用版

在 Nginx 配置文件的 http 或 server 块中添加以下参数,并执行重载命令。

client_max_body_size 100M;
proxy_read_timeout 300s;
proxy_send_timeout 300s;

保存后执行配置检查与重载:

nginx -t && nginx -s reload

为什么会这样

请求经过 Nginx 缓冲,默认限制较小导致截断或超时。Nginx 作为反向代理时,默认 client_max_body_size 为 1M,超过即返回 413 错误。proxy_read_timeout 默认 60s,大文件上传耗时超过此值会触发 504 错误。Django 自身也有内存上传限制,需两端同时调整才能生效。

分步处理

第一步修改 Nginx 配置。打开 nginx.conf 或站点配置文件,在 server 块内写入 client_max_body_size 和超时参数。数值根据实际文件大小设定,例如 100M 对应 100 兆文件。

第二步检查 Nginx 语法。执行 nginx -t 确认配置无语法错误,避免 reload 失败导致服务中断。

Django 大文件上传超时怎么调整 Nginx 客户端超时设置

第三步修改 Django 设置。在 settings.py 中设置 DATA_UPLOAD_MAX_MEMORY_SIZE 和 FILE_UPLOAD_MAX_MEMORY_SIZE,单位是字节。若不使用内存文件处理器,需确保临时目录权限正确。

第四步重启应用服务。根据使用的应用服务器执行重启,例如 systemctl restart gunicorn 或 supervisorctl restart all。

怎么验证是否生效

查看 Nginx 错误日志。路径通常在 /var/log/nginx/error.log,观察上传过程中是否有 413 或 504 记录。

使用 curl 命令测试。构造一个指定大小的文件进行上传请求,确认返回状态码为 200 而非 413 或 504。

curl -X POST -F "file=@large_file.bin" http://your-domain.com/upload/

观察 Django 应用日志。确认后端接收到完整文件,没有因超时中途断开连接。

Django 大文件上传超时怎么调整 Nginx 客户端超时设置

常见坑

413 与 504 混淆。413 是 body 大小超限,需调 client_max_body_size。504 是处理超时,需调 proxy_read_timeout。

内存溢出风险。client_max_body_size 过大会导致 Nginx 尝试将大文件读入内存,建议开启 proxy_request_buffering off 或使用临时文件缓冲。

Django 层未同步。仅改 Nginx 不改 Django,请求虽通过 Nginx 但会被 Django 中间件拒绝。

常见问题

上传报 413 Request Entity Too Large 怎么办

增大 Nginx 的 client_max_body_size 值。该参数控制允许客户端请求的最大实体内容大小,默认值较小。

上传报 504 Gateway Time-out 怎么办

增大 Nginx 的 proxy_read_timeout 值。该参数定义 Nginx 从上游服务器读取响应的超时时间,大文件上传需要更长时间。

Django 需要修改哪些设置

需要修改 DATA_UPLOAD_MAX_MEMORY_SIZE 和 FILE_UPLOAD_MAX_MEMORY_SIZE。这两个参数控制 Django 处理上传数据时的内存阈值。

参考来源

  • Nginx Documentation, ngx_http_core_module, http://nginx.org/en/docs/http/ngx_http_core_module.html
  • Django Documentation, Settings, https://docs.djangoproject.com/en/stable/ref/settings/