Nginx+Docker+Gunicorn环境下如何禁用上游缓冲解决大文件上传进度条异常
问题根因
你当前配置的proxy_request_buffering off未生效的核心原因是:Nginx默认向上游服务转发请求时使用HTTP/1.0协议,该版本不支持chunked编码的流式请求体传输,所以Nginx仍会先完整接收客户端上传的全部文件,再转发给Gunicorn,就会出现XHR上传进度提前到100%、后续等待后端处理的问题。
修复方案
修改Nginx的default.conf配置中/api/的location块,新增2行配置指定使用HTTP/1.1协议转发请求:
location /api/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; # 新增以下2行 proxy_http_version 1.1; proxy_set_header Connection ""; # 原有配置保留 proxy_buffering off; proxy_request_buffering off; proxy_redirect off; proxy_pass http://hello_django; }
额外校验项
- 你使用的Nginx 1.20.0版本原生支持
proxy_request_buffering指令,无需升级版本 - 如果上传的文件超过1G,可适当调高Gunicorn启动命令中的
--timeout参数,避免后端处理超时断开连接
验证方法
修改配置后重启Nginx容器,重新上传大文件即可看到XHR进度条与实际上传速度匹配,不会出现提前跳满的问题。
内容的提问来源于stack exchange,提问作者Vokson
相关产品推荐
相关产品推荐

