分布式大文件托管

分布式大文件托管

我们在 S3 上托管软件安装程序 (~60Mb),并通过 CloudFront 提供服务。我们注意到,经常不下载的文件会从 CF 缓存中删除,因此下载速度比平时慢。我怀疑其他 CDN 提供商对不经常访问的文件也有同样的行为。

我正在考虑创建 4 台服务器,而不是 S3+CF:2 台在美国,1 台在欧洲,1 台在澳大利亚。这些服务器应该可以覆盖我们的大多数客户。

问题是如何配置它们以使其方便、几乎无需维护。使用 S3+CF,我无需花时间配置服务器 - 它们就可以正常工作。我正在寻找类似的解决方案。

我考虑从 DigitalOcean 租用 4 个 Droplet,并使用 Cloudways 进行配置。然后我将配置 DNS 提供商以将客户引导到最近的服务器。这将花费我 17*4=68 美元,几乎与我们目前为 CloudFront 流量支付的费用相同。但是,我不喜欢 CloudWays 及其支持。有时事情根本不起作用,他们会手动更改服务器,所以事情并不像想象的那么简单。

还有其他选择吗?

答案1

概述

不幸的是,您无法控制 CloudFront (CF) 驱逐 - 它们可能随时驱逐对象。但是,CF 使用 AWS 内部网络(而不是互联网)连接到 S3,因此获取对象应该比用户直接从 S3 获取对象更快。这仍然可能不能满足您的需求。

调整当前设置

但是,您应该检查您的 CF 配置。在现有设置中,您应该创建一个不通过 cookie 或标头的行为,这样请求设置的所有用户都会获得相同的对象。如果您通过 cookie 和标头传递,CF 可能会缓存同一安装的 1000 个版本,因此会定期将其逐出。

当然,您应该查看源端发送给 CF 的缓存标头。如果没有发送任何缓存标头,请在 CF 中定义 TTL。

另外一个选择

如果当前设置无法正常工作,您可以在每个 AWS 区域创建 S3 存储桶,而不是托管服务器。您无法自动将用户引导到最近的存储桶,但您可以使用地理位置并生成指向您认为最接近用户的存储桶的链接。

CF 可以配置为将标头“Cloudfront-Viewer-Country”添加到请求中。您可以使用行为将这些标头仅添加到非常特定的请求中,您应该这样做,否则您的缓存命中率会降低。这是因为缓存是按标头进行的,因此命中 CF 节点的每个不同国家/地区都会在缓存中拥有自己的项目。这反过来会降低命中率。

您的应用程序/ Web 服务器可以接收此标头,决定使用哪个 S3 区域/存储桶,并生成最靠近用户的存储桶的链接。

过早优化

因为下载量很小,我想知道这个问题是否是过早优化的一个例子。在世界上任何有良好互联网连接的地方,60MB 应该下载得相当快。如果他们的最后一英里连接很差,那么从哪里下载就不重要了。

您实际上并没有给我们一个问题,例如“这个国家的用户下载速度很慢”,您只是描述了可能导致问题的技术。

答案2

我们注意到,未下载的文件经常会从 CF 缓存中删除,因此下载速度比平时慢。

您是否已设置Expires您的源上的标头是否正确?您应该能够将标头设置为将来的标头,这将指示 Cloudfront 不要经常使对象过期。

问题是如何配置它们以变得方便且几乎免维护。

您不妨开始在森林里寻找木精灵。:)

老实说,运行服务器需要维护。如果你忽视了维护,服务器就会遭到黑客攻击,你的服务器会被僵尸网络利用,你的数据会被泄露,而且在恢复期间,你也会遇到糟糕的一天(或一个月)。

但是,我不喜欢 CloudWays 及其支持。

那就不要使用它们。

如果您真的认为自托管是可行的方法,那么请寻求系统管理员的帮助,他们可以监视事物并保持修补和健康。 注意:这不需要太多时间,可能每个月只需几个小时。 这样做甚至可能比支付 Cloudways 等解决方案更便宜,并且会更灵活。

相关内容