Những gì tôi đã làm trong quá khứ là sử dụng PaperClip với Amazon S3 và CloudFront CDN để phân phối nhanh hơn. PaperClip hỗ trợ lưu trữ S3 rất độc đáo: xem tài liệu của họ để biết các tùy chọn cấu hình lưu trữ S3 .
- Thiết lập phân phối CloudFront để chuyển tiếp các yêu cầu hình ảnh đến nhóm S3 của bạn và các yêu cầu khác về tài sản tĩnh cho ứng dụng Ruby on Rails của bạn (ngoài ra, bạn cũng có thể tải chúng lên S3, nhưng nằm ngoài phạm vi của câu hỏi này).
- CNAME một tên miền bạn kiểm soát (chẳng hạn như nội dung.example.com) để trỏ đến bản phân phối CloudFront của bạn.
- Trong cấu hình PaperClip, đặt
s3_host_alias: assets.example.com
. Điều này sẽ khiến các URL được tạo thành tài nguyên hình ảnh đã lưu để sử dụng máy chủ phân phối CloudFront của bạn.
- Trong cấu hình Ruby on Rails, bạn có thể thực hiện
config.action_controller.asset_host = http://assets.example.com
. Các URL tài sản của Ruby on Rails sau đó cũng sẽ sử dụng bản phân phối CloudFront của bạn, để lưu trữ / phân phối nhanh hơn.
Điều đó khá sơ sài, nhưng nó hy vọng sẽ chỉ cho bạn hướng đi của một số tài nguyên hữu ích. Tất nhiên, đó chỉ là một giải pháp, nhưng đó là một giải pháp phù hợp với tôi trong tình huống tôi phải xử lý hàng trăm ngàn tệp đính kèm hình ảnh trong cơ sở dữ liệu.
(Là một bước tiến có thể là có thể không cần thiết hoặc hữu ích cho trường hợp của bạn, bạn cũng có thể thiết lập nhiều CNAME để phân phối CloudFront của bạn, chẳng hạn như assets0.example.com
và assets1.example.com
. Cả hai chiếc kẹp giấy s3_host_alias
và action_controller.asset_host
sau đó có thể mất lambdas mà sẽ cho phép bạn deterministically (dựa trên nội dung) tạo các URL sử dụng các máy chủ khác nhau, để song song tốt hơn nếu bạn đang tải xuống một loạt chúng trên cùng một trang, vì các trình duyệt sẽ giới hạn các kết nối đồng thời tối đa cho cùng một máy chủ.)