核心是延长关键超时时间、关闭代理缓冲、确保磁盘空间充足:需将proxy_read_timeout和proxy_send_timeout设为300秒或更高,location中配置proxy_buffering off,并确认proxy_temp_path目录可写且空间充足。

核心是延长关键超时时间、关闭代理缓冲、确保磁盘空间充足。Nginx 默认按短请求设计,大文件下载时容易在 60 秒左右中断,不是网络问题,而是配置未适配传输场景。
调高 proxy_read_timeout 和相关超时参数
这是最直接有效的改动。默认 60 秒对百 MB 以上文件远远不够,尤其在网络波动或服务响应稍慢时:
- proxy_read_timeout:必须设为足够长(如 300 或 600),它控制 Nginx 等待后端返回数据的最长时间
- proxy_send_timeout:建议同步设为相同值,防止向后端发送大请求体时被中断
- proxy_connect_timeout:可设为 60,影响初始建连,一般无需过大
关闭 proxy_buffering 并检查临时目录权限与空间
开启缓冲时,Nginx 会先将整个响应写入内存或磁盘临时文件再发给客户端。一旦磁盘满、不可写或缓冲区溢出,就会出现“upstream prematurely closed connection”或“no space left on device”错误:
- 在对应 location 块中加 proxy_buffering off;,让响应流式直传,避免缓存环节
- 若必须开启缓冲(如需 gzip 或 header 处理),请确认 proxy_temp_path 目录存在、可写,且所在分区有足够空间(至少大于文件最大体积)
- 检查 proxy_max_temp_file_size 是否合理,默认 1G,大文件需调高
补充关键配置防中间干扰
仅调超时还不够,某些默认行为会破坏长连接稳定性:
- 添加 proxy_http_version 1.1;,确保支持持久连接
- 设置 tcp_nodelay on;,减少小包延迟,提升传输效率
- 如有 gzip,建议在下载路径中禁用:gzip off;,避免压缩破坏流式响应边界
- 确保 client_max_body_size 足够(如 0 或 4g),虽下载不涉及请求体,但部分前端 SDK 可能带额外 header 或 token
验证与定位技巧
改完配置别急着 reload,先做几项快速验证:
- 用 curl -v http://your-domain/file.zip 观察是否全程无 504/502,Connection: keep-alive 是否生效
- 查看 Nginx error.log,重点搜 "upstream timed out"、"prematurely closed"、"No space left"
- 绕过 Nginx 直连后端服务测试下载,确认问题确实出在代理层
- 用 df -h 检查 proxy_temp 所在分区剩余空间











