从远程服务器“管道”文件内容的最佳方法,通过第二个服务器,输出到浏览器

问题描述

我有许多存储服务器,还有更多用于负载平衡下载的“缓存”服务器。目前我使用 RSYNC 将最流行的文件从存储盒复制到缓存盒,然后用新的服务器 ID 更新数据库,这样我的脚本就可以将下载请求路由到一个随机的包含文件的盒子。>

我现在正在寻找更好的方法来分发内容,并想知道是否可以将请求随机路由到任何框,然后下载脚本检查该文件是否在本地存在,如果不存在,它会从远程存储盒“获取文件内容,并将内容实时输出到浏览器,同时将文件保存在缓存盒中,以便下次发出相同请求时,它可以只服务本地副本,而不是而不是再次连接到存储盒。

希望有意义(!)

我一直在尝试使用 RSYNC、wget 和 cURL 命令,但我正在努力寻找一种方法来将数据输出到浏览器。

我也一直在阅读 Nginx 的反向代理,这听起来是正确的路线......但听起来他们仍然需要将整个文件从源服务器下载到缓存服务器才能输出给客户端的任何东西(?)我的一些文件是 100GB+ 并且每个服务器有 1gbps 的带宽限制,所以充其量,在客户端将看到任何数据之前,最多需要 100 秒将这种大小的文件下载到缓存服务器.必须有一种方法可以在数据流式传输时将数据“管道”到客户端?

我正在努力实现的目标可行吗?

解决方法

您无需使用流下载完整文件即可通过管道传输数据。将文件作为流下载的一个示例是 Guzzle sink 功能。将文件作为流上传的一个示例是 Symfony StreamedResponse。使用这些可以完成以下操作:

  1. 服务器 A 有用户想要的文件
  2. 服务器 B 获取用户对文件的请求
  3. 服务器 B 使用 Guzzle 设置到服务器 A 的下载流
  4. 服务器 B 将 StreamedResponse 直接输出给用户

这样做将实时提供下载服务,而无需等待整个文件完成。但是我不知道您是否可以将流传输给用户并同时将文件存储在磁盘上。 PHP 中有一个 stream_copy_to_stream 函数可能允许这样做,但不确定。