nginx + php-fpm 上下载所有数据后下载失败。
我正在使用 PHP 脚本控制 zip 文件(每个大约 100mb)的下载,该脚本将文件直接传输到客户端。我在 Ubuntu 14.04 下使用带有 nginx 的 php-fpm。偶尔下载会成功,但通常在传输完所有数据后会失败。
在 Chrome 和 Firefox 客户端浏览器上,下载过程一直进行到最后,但随后会挂起并失败。有时 zip 文件的名称是错误的“foo.zip.crdownload”,有时则已损坏。我该怎么做才能调试这个?
(编辑:日志中没有显示任何内容,但最终显示下载失败,并显示“读取上游、客户端的响应头时上游超时(110:连接超时)”)
我正在使用 CloudFlare CDN/Proxy,但今天之前该网站是通过 Apache 2 运行的。我已禁用下载 URL 的缓存。我还尝试将 mime 类型从“application/octet-stream”更改为“application/zip”,但仍然会间歇性失败。
答案1
这似乎部分是超时。这个 tekovic 链接有帮助:基本上你需要设置fastcgi_读取超时将内容部分中的值设置为下载开始前允许的合理秒数(默认为 60 秒)。
location ~* \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_read_timeout 120;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
“指令设置上游等待 fastcgi 进程发送数据的时间。如果您有长时间运行的 fastcgi 进程,且在处理完成之前不产生输出,请更改此指令。如果您在错误日志中看到上游超时错误,请将此参数增加到更合适的值。”
接下来我配置云Flare不缓存下载发生的特定目录,也不将其保持“始终打开” - 页面规则模式应该是这样的
*mywebsite.com/downloads/*