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秒:
若使用systemd管理gunicorn服务,直接在service配置文件的gunicorn --timeout 120 djangoProject.wsgi:applicationExecStart字段中添加该参数即可。 - 切换异步worker模型
安装gevent依赖:
启动时指定异步worker类型,避免单请求阻塞整个worker:pip install geventgunicorn --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运行用户授予该目录的读写权限:
也可以在settings.py中显式指定有权限的临时目录:chown -R gunicorn运行用户:用户组 /path/to/your/temp/dirFILE_UPLOAD_TEMP_DIR = '/var/tmp/django_upload' - 可选优化:取消请求大小限制
启动gunicorn时添加如下参数,避免大请求的请求行、请求头被截断:gunicorn --limit-request-line 0 --limit-request-field_size 0 其他参数
内容的提问来源于stack exchange,提问作者Ashutosh Singh
相关产品推荐
相关产品推荐

