下载 2.8G 的备份包,30 秒后返回 504 Gateway Timeout,nginx 错误日志里同时出现 write() failed (28: No space left on device)。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,代理默认把上游响应缓冲到临时目录,2.8G 超过分区剩余空间,写满后连接中断。proxy_read_timeout 还是默认 60 秒,大文件根本传不完。

「大附件下载 504」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。报错里带路径的,先去看那个路径在不在、权限对不对。

proxy_buffering off;
proxy_max_temp_file_size 0;
proxy_read_timeout 600s;

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,这个下载路径关掉 proxy_buffering 让数据直接透传;把 proxy_max_temp_file_size 设为 0 禁止落临时文件;超时按文件大小调大 或者改成对象存储签名地址直连。

最后用这个标准收尾,同一 2.8G 文件下载完成,耗时约 4 分钟,nginx 日志没有 504 和磁盘写入错误。

作者 9823189