Django+Gunicorn+Nginx部署时大文件上传冻结排查求助
解决Nginx反向代理Django/Gunicorn大文件上传冻结问题
看起来你已经做了不少基础配置调整,但大文件上传冻结的问题通常是超时链不完整或者权限/缓冲设置的问题,下面是几个你可能遗漏的关键点:
1. 补全Nginx代理端的超时配置
你目前只设置了send_timeout,但这个参数是控制Nginx向客户端发送响应的超时,反向代理场景下,还需要配置Nginx和后端Gunicorn之间的交互超时,避免上传过程中Nginx提前断开连接。
在你的location /块中添加以下配置:
proxy_connect_timeout 300s; # 和Gunicorn建立连接的超时 proxy_send_timeout 300s; # Nginx向Gunicorn发送请求的超时 proxy_read_timeout 300s; # Nginx等待Gunicorn响应的超时 proxy_buffering off; # 禁用代理缓冲,大文件直接透传,避免内存瓶颈或缓冲超时
2. 检查Django的上传限制(关闭debug后易忽略)
关闭debug模式后,Django的默认上传限制可能会影响大文件上传,需要在settings.py中明确配置:
# 允许内存中直接处理的最大文件大小(超过则写入临时文件) FILE_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 10MB,可按需调整 # 允许的POST请求总数据大小 DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 指定临时文件存储目录,确保Django进程有读写权限 FILE_UPLOAD_TEMP_DIR = "/tmp/django_uploads"
注意:要手动创建FILE_UPLOAD_TEMP_DIR指定的目录,并给Django运行用户赋予读写权限。
3. 调整Gunicorn的超时参数
Gunicorn默认超时为30秒,大文件上传很容易超过这个时间,导致Gunicorn进程被强制终止,进而让上传冻结。启动Gunicorn时添加超时参数:
gunicorn --timeout 300 your_project_name.wsgi:application
这里的300是300秒(5分钟),可以根据你的文件大小和网络情况调整。
4. 验证Nginx临时上传目录的权限
你设置了client_body_temp_path /Users/user/media;,但要确保这个目录对Nginx的运行用户有读写权限。可以通过以下命令检查:
# 查看Nginx进程的运行用户 ps aux | grep nginx # 给目录赋予正确权限(替换成你的用户名) chown -R your_username:your_username /Users/user/media chmod -R 755 /Users/user/media
如果Nginx没有权限写入临时目录,上传到一半就会卡住。
5. 确认Mac系统的sendfile配置
你已经尝试过sendfile off,但建议把这个配置放在nginx.conf的http全局块中,而不是仅在server块:
http { # ... 其他现有配置 ... sendfile off; tcp_nopush off; # 关闭sendfile后,tcp_nopush也建议关闭,避免传输异常 }
完成以上配置后,重启Nginx和Gunicorn,再测试大文件上传应该就能解决冻结问题了。
内容的提问来源于stack exchange,提问作者Eli Korvigo
相关产品推荐
相关产品推荐

