location /protected/ {
    internal;
    alias /data/files/;
}
# PHP: header('X-Accel-Redirect: /protected/' . $name);

下载 1.2GB 的镜像包,进度到 90% 左右页面报 504 Gateway Timeout,Nginx 错误日志写着 upstream timed out (110: Connection timed out),重试三次都在同一位置断。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:文件由 PHP 读取后输出,反向代理的 proxy_read_timeout 只有 60 秒,大文件传到一半连接就被切断。PHP 的 max_execution_time 也在同一时间点终止脚本。

「大文件下载超时」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:大文件改由 Nginx 直接发送,用 X-Accel-Redirect 交给静态服务;代理超时调到 600 秒,传输限速单独配置;完整下载一次 1.2GB 文件,比对 md5 是否一致。

确认没问题再收工,1.2GB 文件一次下载完成,md5 与服务器上的文件一致。

作者 9823189