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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:39