В прошлом я использовал PaperClip с Amazon S3 и CloudFront CDN для более быстрой доставки. PaperClip прекрасно поддерживает встроенное хранилище S3: см. Их документацию по параметрам конфигурации хранилища S3 .
- Настройте дистрибутив CloudFront для пересылки запросов изображений в корзину S3 и других запросов статических ресурсов в приложение Ruby on Rails (в качестве альтернативы вы также можете загрузить их в S3, но это выходит за рамки этого вопроса).
- CNAME домен, которым вы управляете (например, assets.example.com), чтобы указать на ваш дистрибутив CloudFront.
- В конфигурации PaperClip установите
s3_host_alias: assets.example.com
. Это приведет к тому, что сгенерированные URL-адреса к сохраненным ресурсам изображений будут использоваться вашим хостом распространения CloudFront.
- В вашей конфигурации Ruby on Rails вы можете сделать это
config.action_controller.asset_host = http://assets.example.com
. URL-адреса ресурсов Ruby on Rails также будут использовать ваш дистрибутив CloudFront для кэширования / ускорения доставки.
Это довольно схематично, но, надеюсь, укажет вам некоторые полезные ресурсы. Конечно, это всего лишь одно решение, но оно помогло мне в ситуации, когда я имел дело с сотнями тысяч вложений изображений в базе данных.
(В качестве возможного продвинутого шага, который может и не понадобиться или не пригодиться для вашего случая, вы также можете настроить несколько CNAME для своего дистрибутива CloudFront, например, assets0.example.com
и assets1.example.com
. Обе скрепки s3_host_alias
и action_controller.asset_host
затем могут принимать лямбды, которые позволят вам детерминистически (на основе asset) генерировать URL-адреса, использующие разные хосты, для лучшего распараллеливания, если вы загружаете их на одной странице, так как браузеры ограничивают максимальное количество одновременных подключений к одному хосту.)