Apa yang saya lakukan di masa lalu adalah menggunakan PaperClip dengan Amazon S3 dan CloudFront CDN untuk pengiriman yang lebih cepat. PaperClip mendukung penyimpanan S3 dengan sangat baik di luar kotak: lihat dokumentasi mereka untuk opsi konfigurasi penyimpanan S3 .
- Siapkan distribusi CloudFront untuk meneruskan permintaan gambar ke bucket S3 Anda dan permintaan lainnya untuk aset statis ke aplikasi Ruby on Rails Anda (atau Anda juga dapat mengunggahnya ke S3, tapi itu di luar ruang lingkup pertanyaan ini).
- CNAME domain yang Anda kontrol (seperti assets.example.com) untuk mengarah ke distribusi CloudFront Anda.
- Dalam konfigurasi PaperClip, atur
s3_host_alias: assets.example.com
. Ini akan menyebabkan URL yang dihasilkan ke sumber daya gambar yang disimpan untuk menggunakan host distribusi CloudFront Anda.
- Dalam konfigurasi Ruby on Rails Anda, Anda dapat melakukannya
config.action_controller.asset_host = http://assets.example.com
. URL aset Ruby on Rails kemudian juga akan menggunakan distribusi CloudFront Anda, untuk caching / pengiriman yang lebih cepat.
Itu cukup samar, tetapi mudah-mudahan itu menunjukkan Anda ke arah beberapa sumber daya yang berguna. Tentu saja, itu hanya satu solusi, tetapi itu salah satu yang telah bekerja untuk saya dalam situasi di mana saya berurusan dengan ratusan ribu lampiran gambar dalam database.
(Sebagai langkah lanjutan yang mungkin tidak diperlukan atau berguna untuk kasus Anda, Anda juga dapat mengatur beberapa CNAME untuk distribusi CloudFront Anda, seperti assets0.example.com
dan assets1.example.com
. Keduanya penjepit kertas s3_host_alias
dan action_controller.asset_host
kemudian dapat mengambil lambda yang akan memungkinkan Anda untuk secara deterministik (berdasarkan pada aset) menghasilkan URL yang menggunakan host yang berbeda, untuk paralelisasi yang lebih baik jika Anda mengunduh banyak dari mereka di halaman yang sama, karena browser akan membatasi koneksi simultan maksimum ke host yang sama.)