You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+gunicorn+nginx环境上传大文件出现connection reset错误如何解决

问题成因
  • 32位运行环境限制:如果你的EC2操作系统、Python解释器、Gunicorn进程任意一项是32位架构,单个文件最大支持大小为2GB,超过该阈值就会触发连接中断
  • 后端服务超时:大文件上传需要的时间远超Gunicorn、Nginx的默认超时阈值,超时后服务主动断开连接
  • 代理缓存磁盘不足:Nginx默认会先完整接收客户端上传的请求体再转发给后端Gunicorn,若Nginx临时目录所在磁盘分区空间不足,2GB以上文件写入到一半时就会触发断连
  • Django临时目录空间不足:超过内存阈值的上传文件会写入Django指定的临时目录,若该目录所在分区剩余空间小于文件大小,会触发写入失败导致连接重置
遗漏的配置项

你已经配置了Nginx的基础上传限制,还遗漏了Django、Gunicorn两层的相关配置,核心缺失项如下:

Django侧缺失配置

  • FILE_UPLOAD_TEMP_DIR:未明确指定大容量磁盘下的临时存储目录,默认的/tmp分区在小规格EC2上通常空间很小,无法容纳2GB以上的临时文件
  • 若你之前未调整过全局请求大小限制,也可能存在DATA_UPLOAD_MAX_MEMORY_SIZE参数值不足的问题

Gunicorn侧缺失配置

  • 超时时间:默认30s的超时时间完全无法满足2GB以上文件的上传需求
  • 代理请求限制:默认同步worker处理长耗时的大文件上传请求时极易阻塞中断
  • 部分用户会手动配置limit_request_body参数,若该值小于4GB也会触发截断
解决步骤
  1. 调整Django项目settings.py配置:
# 全局请求体最大限制设为4.5GB,预留冗余空间
DATA_UPLOAD_MAX_MEMORY_SIZE = 4831838208
# 单个文件超过100MB就写入临时磁盘,避免占用过多服务内存
FILE_UPLOAD_MAX_MEMORY_SIZE = 104857600
# 替换为你EC2上剩余空间≥5GB的目录路径,需要给运行Django的用户开通读写权限
FILE_UPLOAD_TEMP_DIR = '/path/to/large-capacity/temp-dir'
  1. 调整Gunicorn启动参数,示例如下:
# 替换为你项目的WSGI入口,超时设为600s即10分钟,可根据实际上行带宽调整
gunicorn --workers 4 --worker-class gevent --timeout 600 --limit-request-body 0 your_project.wsgi:application
  1. 补充Nginx站点配置,在转发到Gunicorn的location块中新增以下参数:
location / {
    # 保留你原有代理配置不变,新增如下内容
    client_max_body_size 4.5G;
    # 关闭代理请求缓存,Nginx边接收边转发给后端,避免占用本地磁盘
    proxy_request_buffering off;
    # 读写超时和Gunicorn对齐
    proxy_read_timeout 600;
    proxy_send_timeout 600;
}
  1. 验证运行环境:确认EC2操作系统、Python解释器均为64位架构,执行python -c "import sys; print(sys.maxsize > 2**32)",返回True即为64位环境
  2. 重启所有服务生效:先重启Gunicorn进程,再执行nginx -s reload重载Nginx配置
  3. 额外检查:确认EC2安全组、网络ACL未限制长连接,临时文件目录有足够可用空间和读写权限

内容的提问来源于stack exchange,提问作者Amit Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:36:04