19

मैं अपने रेल 3.1 आवेदन पर क्लाउडफ्लारे सीडीएन का उपयोग कर रहा हूं। क्लाउडफ्लेयर एक सीडीएन है जो DNS स्तर पर काम करता है। एक स्थिर संपत्ति पर पहली हिट पर, क्लाउडफ्लेयर इसे आपके ऐप से लोड करता है और फिर इसे अपने सीडीएन में कैश करता है। आपके ऐप के बजाय सीडीएन से उस संपत्ति लोड के लिए भविष्य के अनुरोध।मैं रेल की 3.1 को स्थिर संपत्तियों को कैश करने से Rails.cache में कैसे रोकूं?

config.action_controller.perform_caching = true 

यह रैक :: कैश मिडलवेयर सक्षम बनाता है:

समस्या मैं आ रही हैं कि अगर आप सच करने के लिए नियंत्रक कैशिंग सेट है। चूंकि रेल स्थिर परिसंपत्तियों के लिए डिफ़ॉल्ट कैश नियंत्रण सेटिंग सेट करते हैं, इसलिए उन संपत्तियों को Rails.cache स्टोर में लिखा जाता है। नतीजतन मेरा कैश स्टोर (मेरे मामले में रेडिस) को स्थिर संपत्तियों के साथ यूएसएल के साथ हैश कुंजी के रूप में भर दिया जा रहा है।

दुर्भाग्य से, क्लाउडफ्लेयर और मेरे उपयोगकर्ता के ब्राउज़र संपत्तियों को कैश करने के तरीके को प्रभावित किए बिना स्थिर संपत्ति कैश नियंत्रण शीर्षलेख को बंद नहीं कर सकते हैं। मैं नियंत्रक कैशिंग बंद नहीं कर सकता या मैं पेज/एक्शन/खंड कैशिंग खो देता हूं। अगर मैं रैक :: कैश मिडलवेयर हटा देता हूं तो वही परिणाम।

क्या किसी के पास कोई अन्य विचार है?

अद्यतन: मैंने गिटहब here पर एक टिकट खोला है।

+0

जब आप स्थैतिक संपत्ति कहते हैं तो क्या आपका मतलब केवल स्प्राकेट उत्पन्न करता है? –

+0

हाँ, मैं करता हूं। हैश ने फ़ाइल नामों में जोड़ा है। –

उत्तर

7

मूल पोस्टर स्थैतिक परिसंपत्तियों को सामान्य रेल कैश में आने से रोकना चाहता था, जिससे उन्हें रैक :: कैश को अक्षम करना पड़ा। ऐसा करने के बजाय, सामान्य रेल कैश की तुलना में एक अलग कैश का उपयोग करने के लिए रैक :: कैश को कॉन्फ़िगर करना बेहतर समाधान है।

रैक :: कैश को इकाई भंडारण बनाम मेटा स्टोरेज के लिए अलग-अलग कॉन्फ़िगर किया जाना चाहिए। रैक :: कैश में दो अलग-अलग भंडारण क्षेत्र हैं: मेटा और इकाई स्टोर। मेटास्टोर प्रत्येक कैश एंट्री के बारे में उच्च स्तर की जानकारी रखता है जिसमें HTTP अनुरोध और प्रतिक्रिया शीर्षलेख शामिल हैं। यह क्षेत्र डेटा के छोटे हिस्से को संग्रहीत करता है जो उच्च आवृत्ति पर उपयोग किया जाता है। एंटिटीस्टोर प्रतिक्रिया शरीर की सामग्री को कैश करता है जो अपेक्षाकृत बड़ी मात्रा में डेटा हो सकता है हालांकि इसे मेटास्टोर से कम बार उपयोग किया जाता है।

नीचे कॉन्फ़िगरेशन मेमकैच में मेटास्टोर जानकारी को कैश करता है लेकिन फाइल सिस्टम में संपत्ति का वास्तविक निकाय कैश करता है। दल्ली मणि

config.action_dispatch.rack_cache = { 
    :metastore => Dalli::Client.new, 
    :entitystore => 'file:tmp/cache/rack/body', 
    :allow_reload => false 
} 

का उपयोग वैसे

config.action_dispatch.rack_cache = { 
    :metastore => 'memcached://localhost:11211/meta', 
    :entitystore => 'file:tmp/cache/rack/body', 
    :allow_reload => false 
} 

इस विन्यास Heroku के लिए सिफारिश है:

memcached मणि का उपयोग https://devcenter.heroku.com/articles/rack-cache-memcached-static-assets-rails31

8

के बाद प्रयोग का एक बहुत है, मैं अपने config/application.rb में यह कर समाप्त हो गया है:

if !Rails.env.development? && !Rails.env.test? 
    config.middleware.insert_before Rack::Cache, Rack::Static, urls: [config.assets.prefix], root: 'public' 
end 

क्या करता रैक करने के लिए अनुरोध करने से पहले एक रैक :: स्टेटिक रैक मिडलवेयर जोड़ने है :: कैश। रैक :: स्टेटिक मिडलवेयर रूट निर्देशिका में मिलान करने वाले उपसर्ग के साथ यूआरएल की सेवा करता है। यहां मैं config.assets.prefix को अपने यूआरएल उपसर्ग के रूप में दे रहा हूं जो '/ संपत्ति' के लिए डिफ़ॉल्ट है। मैं रूट को 'सार्वजनिक' निर्देशिका में सेट कर रहा हूं। इस पथ के लिए

अनुरोध:

/assets/jquery-e8da439bbc8fd345e34ac57c6a216318.min.js

इस फाइल में मिल जाना चाहिए:

सार्वजनिक/आस्तियों/jQuery-e8da439bbc8fd345e34ac57c6a216318.min .js

रेलवे :: Ca को मारने के बजाए इसे सीधे सार्वजनिक/संपत्ति निर्देशिका से बाहर किसी भी संपत्ति की सेवा करनी चाहिए ची बिल्कुल, जो इसे रेल कैश_स्टोर में संपत्तियों को संग्रहित करने से रोक देगा। यह केवल तभी काम करेगा यदि आप उत्पादन में 'रेक संपत्ति: प्रीकंपाइल' चलाते हैं, अन्यथा 'सार्वजनिक/परिसंपत्तियों' में कोई प्रीकंपील्ड संपत्ति नहीं होगी।

+0

एक यादृच्छिक तरफ - फ़ाइल नाम में दिखाने के लिए आप अपनी संपत्ति आईडी कैसे प्राप्त करते हैं? – Kevin

+0

क्या आपने उन सभी फ़ाइलों को शामिल करने के लिए 'config.assets.precompile' सेट किया है जिन्हें आप प्रीकंपाइल करना चाहते हैं? –

+0

@ केविन आप अपने उत्पादन में 'config.action_controller.perform_caching = true' सेट कर सकते हैं। आरबी http://guides.rubyonrails.org/asset_pipeline.html#in-production – Schneems

1

एक ही समस्या हल करने के लिए एक और तरीका है और इस मुद्दे रैक के बजाय ActionDispatch :: स्टेटिक मिडलवेयर उपयोग करने के लिए :: इस तरह स्टेटिक है:

if !Rails.env.development? && !Rails.env.test? 
    config.middleware.insert_before Rack::Cache, ::ActionDispatch::Static, 'public', config.static_cache_control 
end 

क्या रैक :: स्टेटिक और ActionDispatch के बीच का अंतर है: : आप पूछते हैं स्टेटिक?

  • रैक :: स्टेटिक यूआरएल अनुरोधों के खिलाफ जांच करने के लिए यूआरएल उपसर्गों की एक सरणी लेता है। तो हमारे मामले में, अगर अनुरोध पथ '/ परिसंपत्तियों' से शुरू होता है तो यह केवल फाइलों की जांच करेगा।

  • एक्शनडिस्पाच :: स्टेटिक पथ के बावजूद प्रत्येक जीईटी/हेड अनुरोध पर 'सार्वजनिक' में फ़ाइल के अस्तित्व की जांच करेगा।

  • रैक :: स्टेटिक पहले फ़ाइल की जांच नहीं करता है, यह फ़ाइल पर रैक :: फ़ाइल.न्यू को कॉल करता है, इसलिए यदि यह अस्तित्व में नहीं है तो यह 404 लौटाएगा, यह अनुरोध को पास नहीं करेगा मिडलवेयर श्रृंखला।

  • यदि एक्शनडिस्पाच :: स्टेटिक को अपने पथ में फ़ाइल नहीं मिलती है, तो यह रैक मिडलवेयर श्रृंखला (बाकी रेल स्टैक) को जारी रखेगी।

अंत में, जो कुछ भी ActionDispatch :: स्टेटिक 'सार्वजनिक' में नहीं मिल रहा है यह सिर्फ रेल ढेर करने के लिए नीचे पर पारित करेंगे। तो रेल उन संपत्तियों की सेवा समाप्त कर देंगे जो एक्शनडिस्पेच :: स्टेटिक नहीं मिल पा रहे हैं। यह रैक :: कैश द्वारा प्राप्त नहीं होने वाली संपत्तियों के मेरे मुद्दे को हल करता है, लेकिन यह भी अधिक संसाधन गहन है क्योंकि प्रत्येक अनुरोध फ़ाइल जांच को ट्रिगर करेगा।

+0

जब आप कहते हैं कि "हर अनुरोध एक फ़ाइल जांच ट्रिगर करेगा" - क्या आपका मतलब ऐप के हर अनुरोध, या केवल जनता के लिए अनुरोध है? –

+0

इसके अलावा, पहले बुलेट बिंदु में, क्या आप एक्शनडिस्पेच :: स्टेटिक कहने का मतलब रखते थे? –

+1

नहीं यह सही है। रैक :: स्टेटिक यूआरएल उपसर्गों की एक सरणी लेता है। उन्हें कुंजी "यूआरएल" भी कहा जाता है। –

3

आप संपत्ति पाइपलाइन की कैशिंग बंद कर सकते हैं अन्य कैशिंग को स्थानांतरित करते समय फाइलें:

config.assets.cache_store = :null_store 

स्प्राकेट्स को कुछ भी कैशिंग से रखना चाहिए।

+0

यह मेरे ऊपर रेलवे 3.2 पर काम करता है, उपरोक्त सभी उत्तरों के बाद मुझे केवल आधे रास्ते मिल गए। धन्यवाद! –

संबंधित मुद्दे