Używam kombinacji Dragonfly i rack/cache hostowanych na Heroku.Jak buforować pliki powyżej 1 MB z szafą/pamięcią podręczną na Heroku?
Używam Dragonfly do przesłanych zasobów. Miniatury są przetwarzane "w locie" i przechowywane w stelażu/pamięci podręcznej w celu szybkiej dostawy z memcached (poprzez Memcachier addon).
Regularne aktywa statyczne są buforowane w memcached poprzez rack/cache.
Moim problemem jest to, że wszystkie przesłane pliki ponad 1MB powodują błąd 500 w mojej aplikacji.
2013-07-15T10:38:27.040992+00:00 app[web.1]: DalliError: Value too large, memcached can only store 1048576 bytes per key [key: d49c36d5db74ef45e957cf169a0b27b83b9e84de, size: 1502314]
2013-07-15T10:38:27.052255+00:00 app[web.1]: cache: [GET /media/BAhbBlsHOgZmSSIdNTA3Njk3ZWFiODBmNDEwMDEzMDAzNjA4BjoGRVQ/WTW_A5Flyer_HealthcareMedicalObsGynae_WEB.pdf] miss, store
2013-07-15T10:38:27.060583+00:00 app[web.1]: !! Unexpected error while processing request: undefined method `each' for nil:NilClass
Memcache ma limit 1MB, więc mogę zrozumieć, dlaczego mój składnik nie został buforowane, ale wolałbym go nie złamał aktywów stanowiących.
Nie jestem nawet pewien, skąd ten błąd pochodzi. Prawdopodobnie z jednego z innych middleware?
Zwiększenie maksymalnego rozmiaru pliku nie wydaje się mieć żadnego wpływu.
config.cache_store = :dalli_store, ENV["MEMCACHIER_SERVERS"].split(","), {¬
:username => ENV["MEMCACHIER_USERNAME"],¬
:password => ENV["MEMCACHIER_PASSWORD"],¬
:value_max_bytes => 5242880 # 5MB¬
}
długoterminowe, wiem, że przejście tego rodzaju aktywów off Heroku to sensowne posunięcie, ale to nie będzie szybka praca.
Co mogę zrobić, aby służyć te aktywa na Heroku w międzyczasie bez błędów?
to rozwiązanie z powodzeniem działało dla mnie. Dzięki! – Francois
FYI jest API do zmiany nagłówków bez poprawiania małp - patrz http://markevans.github.io/dragonfly/configuration/ (bit "response_header") –