AWS S3用于网站静态图片

3
我们目前正在将网站迁移到EC2,利用OpsWorks。现在,我们在编码中使用相对URL引用网站的所有媒体文件,如“/images/image1.jpg”等。有没有办法将我们的编码中的/images目录别名为S3存储桶?我们想要做的是将大尺寸图像放到S3上,这样它就不会与我们的每个S3实例一起存储。
我知道我们可以为存储桶本身创建一个别名DNS条目,但那样我们就必须在编码中引用完整的URL。例如,http://images.s3-website-us-east-1.amazonaws.com。我们更愿意保持编码中的URL引用相对和绝对路径。
我们正在为PHP / Apache前端EC2实例使用AWS Linux。

1
你可以编写自己的处理程序,在应用程序级别使用S3 CLI并将所有请求路由到S3存储桶,也可以使用Cloudfront(AWS CDN)作为S3存储桶的前端,并指向DNS条目,然后使用images.yoursite.com/images/作为其别名,或者您可以使用类似s3fuse(我个人认为不是很好用)在EC2实例上创建一个挂载点到S3。 - scrowler
2个回答

4
如果你正在使用Apache,你可以使用Apache内置的代理支持来代理所有/images的URL。你需要在Apache配置文件中添加以下内容:
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /images/ http://images.s3-website-us-east-1.amazonaws.com/

实际上,这创建了一个反向代理。当Apache服务器看到匹配/images/的请求时,它会访问S3 URL以获取对象并将其返回给客户端。


1
OP 可能没有意识到一个微妙的问题——它会将所有流量都发送到您的服务器,因此您的服务器上会有更多的数据(和更多的点击量)。但如果您不想引用子域,则这是唯一的方法。 - tedder42
我们的想法是将大型图像文件集中存储在一个单一的点上,而不是将它们存储在每个EC2实例的/images目录中。利用OpsWorks,我们可以准备好几个实例等待加载,并且只需部署约1GB的代码zip文件。如果我们可以将这些图像提取到S3存储桶中,那么部署的zip文件大小将约为200MB,速度更快。 - hiddenicon
除非我漏掉了什么,否则我的建议是将/images/请求(或其他URL路径)代理到S3中,在这种情况下将完美地工作。 图像将驻留在S3上,您可以在站点中引用它们为'/images/big_image.jpg',并且代理语句将导致从S3获取图像。 正如tedder42指出的那样,这种方法会导致所有流量通过OpsWorks实例流动,但根据您的描述,这听起来不像什么大问题。 - Bruce P
没错。我会选择这个方法并测试它。 - hiddenicon
Apache ProxyPass已按计划工作。我回到这个问题,因为现在我需要通过OpsWorks的chef配方自动将该apache代理配置添加到apache配置中。有人对网站进行过模板化或配置调整以“调整”apache配置吗? - hiddenicon
由于这是一个全新的问题,我建议您将其作为一个新问题提交,而不是作为此问题的跟进评论。可能会看到您提出的问题的唯一人员是我们已经在此处发布过评论的人(因此我们收到了您的评论通知),而且就我个人而言,我对Chef没有任何经验。实际上,这听起来像是那种在StackOverflow上已经被问过并得到答案的问题,所以我建议搜索类似的问题,并仅在找不到类似的问题时提交新问题。 - Bruce P

0
你可以设置Apache,将重定向返回到存储在S3中的图像的URL。

你能详细说明一下吗? - scrowler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接