Nginx (विकास के लिए) के साथ स्थिर फ़ाइलों की सेवा करते समय कैशिंग अक्षम करें


89

हम एक विकास मंच पर स्थिर फ़ाइलों की सेवा करने के लिए Nginx का उपयोग कर रहे हैं। जैसा कि यह एक विकास मंच है, हम कैशिंग को अक्षम करना चाहेंगे ताकि प्रत्येक परिवर्तन सर्वर पर प्रसारित हो। विहस्ट का विन्यास काफी सरल है:

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  } 
}

जब हम एक HTML फ़ाइल ( http: //static.server.local/test.html ) का उपयोग करते हैं, तो हमारे पास कोई समस्या नहीं है: सर्वर एक कोड लौटाता है 304 तब तक संशोधित नहीं किया जाता है जब तक कि फ़ाइल बदल नहीं जाती है, और 200 के साथ एक ठीक प्रतिक्रिया फ़ाइल बदली जाने पर संशोधित फ़ाइल।
हालाँकि, यह एक जावास्क्रिप्ट या CSS फ़ाइल के साथ अलग तरह से व्यवहार करता है। एक बार फ़ाइल बदलने के बाद, हमें उम्मीद के मुताबिक 200 ओके रिस्पॉन्स मिलता है, लेकिन पुराने टेक्स्ट के साथ।
क्या नगीनक्स में एक आंतरिक कैश तंत्र है जो इस व्यवहार की व्याख्या कर सकता है? या कुछ विन्यास जो हमें जोड़ना चाहिए?

एक साइड नोट के रूप में, फाइल को संशोधित किया गया है (यह सही लगता है)

Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54

संपादित करें निर्देश और हेडर के
साथ विभिन्न सेटिंग्स की कोशिश करने के बाद , मैंने कुछ और जांच की। वास्तव में, सर्वर को एक वर्चुअलबॉक्स अतिथि उबंटू पर स्थापित किया गया है, और डेटा को एक साझा फ़ोल्डर से पढ़ा जाता है जो मैक ओएसएक्स होस्ट पर है। यदि फ़ाइल को होस्ट पर एक IDE (NetBeans) से संपादित किया जाता है, तो ऐसा लगता है कि परिवर्तन दिखाई नहीं देते हैं जबकि अगर मैं इसे सीधे अतिथि (VIM का उपयोग करके) पर संपादित करता हूं, तो यह ताज़ा हो जाता है। अजीब बात यह है कि यह HTML फ़ाइलों के साथ समान व्यवहार नहीं करता है। काफी हैरान करने वाला।expiresCache-Control


संपादन 2 (उत्तर)
वास्तव में, मुद्दे की उत्पत्ति वर्चुअलबॉक्स की ओर अधिक थी। या बल्कि VirtualBox और सर्वर के "Sendfile" विकल्प के बीच एक संघर्ष।
इस कड़ी VirtualBox से नफरत करता Sendfile मुझे समाधान दिया: स्विच Sendfile करने के लिए सर्वर विन्यास में झंडा बंद :

sendfile  off;

आशा है कि यह विकास के लिए VirtualBox का उपयोग करने वाले अन्य व्यक्ति की भी मदद कर सकता है। :) वर्चुअलबॉक्स फोरम
पर कुछ अतिरिक्त जानकारी हैं ।


3
क्या आप एक योनि vm में nginx चला रहे हैं और साझा fs का उपयोग कर रहे हैं? #Nginx में उस संयोजन का उपयोग करके आपके लक्षणों की कई रिपोर्ट दी गई हैं।
कोलबिजैक

3
मैं सचमुच तुम्हें गले लगा सकता है !! 48 घंटे बिताए हैं और इस सटीक मुद्दे के साथ पूरी तरह से पागल हो रहे हैं .., कुछ ही समय में पुनर्नवीनीकरण किया, देवताओं को मिश्रित करने के लिए कुछ छोटे शराबी जीवों की बलि दी, कैश निर्देश को पीछे की ओर सीखा ... यह पता लगाने के लिए कि यह ठीक करने के लिए एक लाइन विषमता है VirtualBox के लिए अजीब होने के लिए धन्यवाद!
जेम्स बटलर

13
यह बहुत अधिक स्पष्ट होगा यदि आप अपने उत्तर को उत्तर के रूप में पोस्ट करेंगे और इसे स्वीकार करेंगे तो हर कोई देख सकता है कि यह समस्या हल हो गई थी।
ज़ोम्बाय

मैं आज सुबह इस बग की चपेट में आ गया। यह एहसास नहीं था कि यह इसके बिना साझा किए गए फ़ोल्डर में नीचे था। धन्यवाद!
जाफना।

धन्यवाद! जैसा कि मैंने समझा कि अब इस बग को ठीक करने का कोई और तरीका नहीं है? क्या होगा अगर मुझे
भेजने में

जवाबों:


57

चूंकि उत्तर किसी तरह प्रश्न में छिपा हुआ है - यहाँ स्टैंडअलोन उत्तर के रूप में वर्चुअलबॉक्स वातावरण में nginx के लिए समाधान है।

आपके nginx config (usally /etc/nginx/nginx.conf) या vhost config फाइल में sendfileपैरामीटर को offनिम्न में बदलें :

sendfile  off;

हालांकि sendfile, नगनेक्स की प्रसिद्धि (धधकती-तेज़-निम्न-स्तरीय स्थैतिक फ़ाइल परोसने की दक्षता) के केंद्र में है, यह स्थानीय विकास के लिए एक बैन हो सकता है, जैसे कि Javascripts जो अक्सर बदलते रहते हैं और उन्हें फिर से लोड करने की आवश्यकता होती है। फिर भी Nginx sendfile स्मार्ट है और शायद ज्यादातर लोगों का मुद्दा नहीं है; अपने ब्राउज़र के "अक्षम कैश" विकल्पों को भी जांचें!


5
+1 जवाब में यह बताना चाहिए कि संदर्भ खोजने के लिए पाठकों को खोजने / फिर से पढ़ने के लिए प्रभावी रूप से छोड़ने के बजाय यह क्यों आवश्यक है। उत्तर को अपने दम पर खड़ा करें -> बेहतर।
AD7six

2
यह मेरे लिए जवाब लगता है। समस्या Sendfile, VirtualBox और OSX होस्ट के विशिष्ट संयोजन के साथ होती है। abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forum.virtualbox.org/viewtopic.php?f=1&t=24905
स्टीव बेनेट

sendfileएक स्थानीय विकास के माहौल के लिए भी ठीक है; यह केवल VirtualBox है जिसमें यह टूट गया है। जो एक कारण है (कई में से) मैं VirtualBox से बचने की सलाह देता हूं ...
माइकल हैम्पटन

Vagrant / VirtualBox / Ubuntu / Wordpress के साथ सहेजें, अजीब मुद्दे के लिए धन्यवाद, मैं अनुमान लगा रहा हूं कि मेरा PROD वातावरण डिफ़ॉल्ट के रूप में सेंडफाइल के साथ सुरक्षित है।
सोनाज


15

अपना एक्सपायर टैग सेट करें

expires off;

और यह किसी भी समय समाप्त होने वाले हेडर को सेट नहीं करना चाहिए, यह गलत तरीके से आपकी ब्राउज़र कैशिंग फ़ाइलों का भी हो सकता है


दुर्भाग्य से, मैंने यह कोशिश की है expires -1और व्यवहार अभी भी वैसा ही है।
ओलिवियर चप्पे

ब्राउज़र के बारे में, मैंने इस संभावनाओं के बारे में सोचा है: मैं पहली बार क्रोम के साथ कोशिश कर रहा था, और एक फ़ाइल को संशोधित करने के बाद इसे पहली बार फ़ायरफ़ॉक्स में खोला: मुझे अभी भी फ़ाइल का पहला संस्करण मिला है।
ओलिवियर चप्पे

कैश-कंट्रोल हेडर भी संभवतः CACHE-CONTROL होना चाहिए: NO-CACHE
anthonysomerset

या कैश कंट्रोल हेडर को पूरी तरह से हटा दें - क्षमा करें पिछली टिप्पणी को संपादित नहीं कर सकते हैं
एंथोनीसोमर्सैट

1
Windows पर, "समय सीमा समाप्त" अभी भी html फ़ाइलों के कैशिंग को अक्षम नहीं करता है। जब मैं अपनी IDE में किसी फ़ाइल को अपडेट करता हूं तो सुपर निराशा होती है, लेकिन $ #% nginx एक पुराने संस्करण परोसता है।
डैन डसेलस्कु

2

यदि उपर्युक्त कुछ भी मदद नहीं करता है और फिर भी Nginx आपकी फ़ाइलों की पुरानी सामग्री लौटाता है, तो यह संबंधित समस्या हो सकती है open_file_cache

संदर्भ के रूप में देखें:


2

यह वर्चुअलबॉक्स में पुराना बग है (देखें: # 819 , # 9069 , # 12597 , # 14920 ) जहां vboxvfs को फ़ाइलों के लिए mmapped पहुंच के साथ कुछ समस्याएं हैं जो सिंक किए गए हैं।

यह तब हो सकता है जब आप फ़ाइल को VM के बाहर संपादित करते हैं, और आप VM के भीतर समान परिवर्तन देखने की अपेक्षा करते हैं।

इस समस्या को हल करने के लिए, आपको EnableSendfileविकल्प को अक्षम करके क्लाइंट को फ़ाइलें वितरित करने के लिए कर्नेल सेंडफ़ाइल समर्थन को अक्षम करना होगा । यह एनएफएस या एसएमबी माउंटेड फाइलों के लिए विशेष रूप से परेशानी है।

के लिएNginx (में परिवर्तन nginx.conf), जैसे

sendfile off;

अपाचे के लिए समान ( httpd.confया vhosts फ़ाइल में), जैसे

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

परिवर्तन के बाद अपाचे को फिर से लोड करें।


अन्य संभावित समाधान मेजबान पर फ़ाइलों को संपादित नहीं करने, या उसी फ़ाइल को फिर से संपादित करने की कोशिश करना याद है, लेकिन वीएम के भीतर।


अन्य वर्कअराउंड में लिनक्स पेजेक को छोड़ना शामिल है, जैसे

echo 1 > /proc/sys/vm/drop_caches

या हर सेकंड कैश को साफ़ करने के लिए ( इस पोस्ट के अनुसार ), कोशिश करें:

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

नोट: नंबर 1 का अर्थ पेजकेच को मुक्त करना, डेंट्री और इनोड के लिए 2, पेजचे, डेंट्री और इनोड के लिए 3 है।


उपरोक्त समस्या को एमएमएपी-परीक्षण कार्यक्रम द्वारा दोहराया जा सकता है, देखें mmap-problem.c:।


1

यह देर हो चुकी है, लेकिन अभी भी अनुत्तरित है, इसलिए मैं एक छुरा लूंगा। बस गिगल्स के लिए, क्या आपने कोशिश की है:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

यह खुद करने की कोशिश नहीं की है, लेकिन मैं समय-समय पर सर्वर के कंटेनर में इस तरह की बात करने के लिए सीखा है जब मेरे पास इस तरह के मुद्दे हैं ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.