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

Django搭配gunicorn接收大体积POST请求超时问题排查求助

问题诱因
  • 默认超时配置不合理:gunicorn默认timeout参数为30秒,大体积POST请求的上传、后端逻辑处理总时长超过30秒后,master进程会直接杀掉超时worker,输出WORKER TIMEOUT日志。而Django自带的开发服务器无默认超时限制,因此可以正常处理请求。
  • 同步worker阻塞:gunicorn默认使用sync同步worker模型,单个worker同一时间只能处理一个请求,大文件上传过程会完全占满worker资源,超出超时时间后就会被销毁。
  • 反向代理请求截断:如果部署架构中使用Nginx等反向代理,默认的请求体大小限制(通常为1M)会截断大体积POST请求,导致gunicorn端接收不完整的请求数据,进程卡住直到超时。
  • 临时目录权限异常:Django处理大于2.5M的上传文件时,会先将文件写入临时目录,若gunicorn运行用户对FILE_UPLOAD_TEMP_DIR(默认是系统/tmp目录)没有读写权限,会导致进程IO阻塞,最终触发超时。
解决方法
  • 调整gunicorn超时时间
    启动gunicorn时显式设置合理的超时阈值,示例设置为120秒:
    gunicorn --timeout 120 djangoProject.wsgi:application
    
    若使用systemd管理gunicorn服务,直接在service配置文件的ExecStart字段中添加该参数即可。
  • 切换异步worker模型
    安装gevent依赖:
    pip install gevent
    
    启动时指定异步worker类型,避免单请求阻塞整个worker:
    gunicorn --worker-class gevent --workers 4 --timeout 120 djangoProject.wsgi:application
    
  • 调整反向代理请求体限制(使用Nginx时需要配置)
    在Nginx对应站点的server配置块中添加如下配置,根据业务需求调整最大允许的请求体大小:
    client_max_body_size 100M;
    
    配置完成后执行nginx -s reload重载配置生效。
  • 修复临时目录权限
    确认Django settings.py中配置的FILE_UPLOAD_TEMP_DIR路径,给gunicorn运行用户授予该目录的读写权限:
    chown -R gunicorn运行用户:用户组 /path/to/your/temp/dir
    
    也可以在settings.py中显式指定有权限的临时目录:
    FILE_UPLOAD_TEMP_DIR = '/var/tmp/django_upload'
    
  • 可选优化:取消请求大小限制
    启动gunicorn时添加如下参数,避免大请求的请求行、请求头被截断:
    gunicorn --limit-request-line 0 --limit-request-field_size 0 其他参数
    

内容的提问来源于stack exchange,提问作者Ashutosh Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:04