我过去所做的是将PaperClip与Amazon S3和CloudFront CDN结合使用,以实现更快的交付。PaperClip开箱即用地很好地支持S3存储:有关S3存储配置选项的信息,请参阅其文档。
- 设置CloudFront分发以将图像请求转发到S3存储桶,并将其他静态资产请求转发到Ruby on Rails应用程序(或者,您也可以将这些请求上传到S3,但这不在此问题的范围之内)。
- CNAME您控制的域(例如asset.example.com)指向您的CloudFront发行版。
- 在PaperClip配置中,设置
s3_host_alias: assets.example.com
。这将导致生成的URL到保存的图像资源以使用CloudFront分发主机。
- 然后,在Ruby on Rails配置中,您可以执行
config.action_controller.asset_host = http://assets.example.com
。然后,Ruby on Rails资产URL也将使用您的CloudFront发行版,以进行缓存/更快地交付。
这是很粗略的,但是希望它可以指导您找到一些有用的资源。当然,这只是一种解决方案,但是在我处理数据库中成千上万个图像附件的情况下,它对我有用。
(作为一种可能的高级步骤,对于您的案例而言可能不是必需的或无用的,您还可以为CloudFront发行版设置多个CNAME,例如assets0.example.com
和assets1.example.com
。然后都可以使用回形针s3_host_alias
并action_controller.asset_host
可以使用lambda,以使您可以确定性地(基于资产)生成使用不同主机的URL,如果要在同一页面上下载大量URL,则可以实现更好的并行化,因为浏览器将限制到同一主机的最大同时连接数。)