Rails에서 동적 이미지 캐싱
-
22-07-2019 - |
문제
컨트롤러에서 동적 이미지를 생성하기 위해 rmagick gem을 사용하고 있습니다.컨트롤러는 ID를 매개변수로 사용하고, 모델을 조회하고, 기존 이미지 위에 텍스트를 쓴 후 출력합니다.
모든 요청에 대해 생성하는 것과 디스크에 쓰고 사용하는 것을 비교하는 몇 가지 벤치마크를 실행했습니다. send_data
이미 존재하는 경우 출력합니다.나는 이 두 가지 방법 사이에 요청/초의 차이가 별로 없다는 것을 발견했습니다.
모든 요청에 대해 이미지를 동적으로 생성하는 대신 이미지를 캐싱하거나 디스크에 쓰는 모범 사례가 있습니까?일단 생성되면 이러한 이미지는 대부분 정적으로 유지되지만 특정 시간 간격 후에 다시 생성할 수 있는 옵션도 원합니다.
해결책
가장 좋은 방법은 생성된 이미지를 캐시하고 웹서버가 해당 이미지를 제공하도록 허용하는 것입니다.
Rails 앱 앞에 Apache 또는 Nginx와 같은 웹 서버를 사용하고 웹 서버가 이미지를 제공할 수 있는 위치에 이미지를 작성해야 합니다.따라서 Rails 경로가 다음과 같이 평가되면 /dynamic_images/3.png
(전화 dynamic_images_controller
행동 show
id=3, format=png), 해당 이미지를 public/dynamic_images/3.png
그리고 사용 send_file
컨트롤러에서 보내세요.
다음에 해당 파일이 요청될 때(/dynamic_images/3.png
), 웹 서버는 이를 기꺼이 제공하고(캐시됨) Rails 앱은 절대 공격을 받지 않습니다.
이미지 재생성 및 컨트롤러 코드 정리와 같은 고급 요구 사항에 대해서는 다음을 살펴보십시오. 클립 보석.
다른 팁
그냥 아이디어입니다(시도해본 적 없음):왜 memache를 사용하여 이미지(특히 동적으로 생성된 이미지)를 저장하지 않습니까?
Rails.cache.write("MY_IMAGE", 이미지)
캐시된 이미지를 웹 서버에서 제공할 디렉터리에 넣어야 합니다.이를 위해 send_data를 사용하고 싶지 않습니다. 너무 느립니다.또한 VCS에서 해당 디렉토리를 무시하고 싶을 수도 있습니다.