54

我正在开发一个托管在 Amazon Web Services 上的项目。服务器设置由两个 EC2 实例、一个 Elastic Load Balancer 和一个额外的 Elastic Block Store 组成,Web 应用程序驻留在其中。该项目应该使用 S3 来存储用户上传的文件。为了这个问题,我将调用 S3 存储桶static.example.com

我尝试使用s3fshttps://code.google.com/p/s3fs/wiki/FuseOverAmazon)、(https://github.com/skoobe/riofs)和RioFShttps://code.google.com/p /s3ql/ )。将挂载文件系统,但不允许我写入存储桶(我在 SO 上问了这个问题:如何使用 FUSE 挂载具有适当权限的 S3 卷)。将挂载文件系统并让我从 shell 写入存储桶,但使用 PHP 保存的文件不会出现在存储桶中(我在 GitHub 上打开了该项目的问题)。将挂载存储桶,但存储桶中已经存在的文件都不会出现在文件系统中。s3qls3fsRioFSs3ql

这些是我使用的挂载命令:

s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com
riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com
s3ql mount.s3ql s3://static.example.com /mnt/static.example.com

我也尝试过使用这个 S3 类:https ://github.com/tpyo/amazon-s3-php-class/和这个 FuelPHP 特定的 S3 包:https ://github.com/tomschlick/fuel-s3 。我能够让 FuelPHP 包列出可用的存储桶和文件,但将文件保存到存储桶失败(但没有出错)。

您是否曾经在本地 linux 文件系统上挂载 S3 存储桶并使用 PHP 成功将文件写入存储桶?你用了什么工具?如果您使用上述工具之一,您使用的是什么版本?

编辑 我被告知我RioFS在 GitHub 上打开的问题已经解决。尽管我决定使用S3 REST API而不是尝试将存储桶安装为卷,但如今这似乎RioFS是一个可行的选择。

4

2 回答 2

51

您是否曾经在本地 linux 文件系统上安装过 S3 存储桶?

不。测试很有趣,但我不会让它靠近生产系统。使用库与 S3 通信要好得多。原因如下:

  1. 它不会隐藏错误。文件系统只有一些错误代码可以发送给您以指示问题。S3 库将为您提供来自 Amazon 的确切错误消息,以便您了解正在发生的事情、记录它、处理极端情况等。
  2. 库将使用更少的内存。文件系统层将缓存许多您永远不会再使用的随机内容。库使您可以控制决定缓存什么而不缓存什么。
  3. 扩张。如果您需要做任何花哨的事情(在文件上设置 ACL、生成签名链接、版本控制、生命周期、更改持久性等),那么您将不得不转储文件系统抽象并使用库。
  4. 计时和重试。一部分请求随机出错,可以重试。有时您可能想重试很多次,有时您宁愿快速出错。文件系统不能为您提供精细控制,但库可以。

底线是 FUSE 下的 S3 是一个泄漏抽象。S3 没有(或不需要)目录。文件系统不是为数十亿个文件而构建的。他们的权限模型不兼容。通过尝试将 S3 硬塞到文件系统中,您正在浪费大量的 S3 功能。

用于与 S3 对话的两个随机 PHP 库:

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ - 如果您不仅仅使用 S3 进行扩展,或者如果您需要执行上述任何花哨的请求,那么这个非常有用。

于 2013-05-10T03:58:24.973 回答
2

通常,将文件写入 EBS 卷,然后强制随后对文件的公共请求通过 CloudFront CDN 路由是有利的。

这样,如果应用程序必须对文件进行任何转换,则在本地驱动器和系统上执行会容易得多,然后强制请求转换后的文件通过 CloudFront 从源中提取。

例如,如果您的用户正在为头像上传图像,并且头像图像需要多次迭代以调整大小和裁剪,您的应用可以在本地卷上创建这些图像,但对文件的所有公共请求都将通过云端原始拉取进行要求。这样,您可以最大程度地灵活保留原始文件(或文件的优化版本),任何后续用户请求都可以从云端前端拉取现有版本,或者云端将请求路由回应用程序并创建任何必要的迭代。

上面的一个基本示例是 WordPress,除了保留原始图像(受文件大小限制和/或插件转换)外,它还可以为上传的任何图形图像创建多个大小/裁剪的版本。支持 CDN 的 WordPress 插件,例如 W3 Total Cache 重写请求以通过 CDN,因此应用程序只需要创建唯一的第一个请求迭代。添加浏览器缓存 URL 版本控制 ( http://domain.tld/file.php?x123 ) 进一步优化和利用 CDN 功能。

如果您担心 EBS 卷文件大小或 inode 的快速扩展,您可以对很少请求的文件或过期文件自动执行修剪过程。

于 2015-02-08T19:08:15.043 回答