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


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

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 ठीक है फ़ाइल बदलते समय संशोधित फ़ाइल के साथ प्रतिक्रिया।
हालांकि, ऐसा लगता है कि जावास्क्रिप्ट या सीएसएस फ़ाइल के साथ अलग-अलग व्यवहार करना प्रतीत होता है। एक बार फ़ाइल बदल जाने के बाद, हमें एक मिलता है 200 ठीक है अपेक्षित प्रतिक्रिया, लेकिन पुराने पाठ के साथ।
क्या Nginx में एक आंतरिक कैश तंत्र है जो इस व्यवहार को समझा सकता है? या कुछ विन्यास जो हमें जोड़ना चाहिए?

एक साइड नोट के रूप में, जब फ़ाइल संशोधित की गई है (यह सही लगता है) Nginx द्वारा दिया गया हेडर यहां दिया गया है:

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

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

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

sendfile  off;

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


87
2018-05-13 14:18


मूल


क्या आप एक योनि वीएम में nginx चला रहे हैं और साझा एफएस का उपयोग कर रहे हैं? #Nginx में उस संयोजन का उपयोग करके आपके लक्षणों की कई रिपोर्टें हुई हैं। - kolbyjack
मैं सचमुच आपको गले लगा सकता हूं !! इस सटीक मुद्दे के साथ 48 घंटों तक शाप देने और पूरी तरह पागल होने के लिए खर्च किया है .., कुछ समय के लिए nginx recompiled, मिश्रित देवताओं के लिए कुछ छोटे fluffy प्राणियों को त्याग दिया, कैश निर्देश पीछे की ओर सीखा ... सभी को यह पता लगाने के लिए एक लाइन विषमता है वर्चुअलबॉक्स के लिए अजीब होने के लिए धन्यवाद! - James Butler
यदि आप अपना जवाब उत्तर के रूप में पोस्ट करेंगे और इसे स्वीकार करेंगे तो यह बहुत अधिक स्पष्ट होगा ताकि सभी लोग देख सकें कि यह समस्या हल हो गई है। - Zombaya
इसने मेरी बहुत मदद की। धन्यवाद। - Matt M.
मैं आज सुबह इस बग से मारा गया। यह महसूस नहीं होता कि यह इसके बिना साझा फ़ोल्डर में था। धन्यवाद! - Jaffa The Cake


जवाब:


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

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

sendfile  off;

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


58
2017-11-19 09:52



+1 हालांकि जवाब समझा जाना चाहिए क्यूं कर संदर्भों की तलाश में प्रश्न ढूंढने / पुनः पढ़ने के लिए पाठकों को प्रभावी ढंग से छोड़ने के बजाय यह आवश्यक है। अपने आप को उत्तर स्टैंड बनाएं -> बेहतर। - AD7six
यह मेरे लिए जवाब प्रतीत होता है। यह समस्या Sendfile, वर्चुअलबॉक्स और एक ओएसएक्स होस्ट के विशिष्ट संयोजन के साथ होती है। abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  forums.virtualbox.org/viewtopic.php?f=1&t=24905 - Steve Bennett
sendfile स्थानीय विकास पर्यावरण के लिए भी ठीक है; यह केवल वर्चुअलबॉक्स है जिसमें यह टूटा हुआ है। कौन सा कारण है (कई में से) मैं वर्चुअलबॉक्स से बचने की सलाह देता हूं ... - Michael Hampton♦
सहेजने के लिए धन्यवाद, वग्रेंट / वर्चुअलबॉक्स / उबंटू / वर्डप्रेस के साथ अजीब समस्या, मुझे लगता है कि मेरा प्रोड पर्यावरण डिफ़ॉल्ट रूप से sendfile के साथ सुरक्षित है। - sonjz
Nginx और डॉकर के साथ मेरी समस्या हल करता है - PascalTurbo


अपने समाप्त टैग को सेट करें

expires off;

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


15
2018-05-13 14:20



दुर्भाग्य से, मैंने यह भी कोशिश की है expires -1 और व्यवहार अभी भी वही है। - Olivier Chappe
ब्राउज़र के बारे में, मैंने इस संभावनाओं के बारे में सोचा है: मैं पहली बार क्रोम के साथ प्रयास कर रहा था, और फ़ाइल को संशोधित करने के बाद इसे फ़ायरफ़ॉक्स में पहली बार खोला गया: मुझे अभी भी फ़ाइल का पहला संस्करण मिला है। - Olivier Chappe
कैश-कंट्रोल हेडर भी कैच-कंट्रोल होना चाहिए: नो-कैच - anthonysomerset
या कैश कंट्रोल हेडर को पूरी तरह हटा दें - माफ करना पिछली टिप्पणी संपादित नहीं कर सका - anthonysomerset
विंडोज़ पर, "समाप्त हो जाता है" अभी भी एचटीएमएल फाइलों के कैशिंग को अक्षम नहीं करता है। जब मैं अपने आईडीई में एक फ़ाइल अद्यतन करता हूं तो सुपर निराशाजनक, लेकिन! $ #% Ing nginx पुराने संस्करण परोसता है। - Dan Dascalescu


यदि ऊपर वर्णित कुछ भी मदद नहीं करता है और अभी भी Nginx आपकी फ़ाइलों की पुरानी सामग्री देता है तो इससे संबंधित समस्या हो सकती है open_file_cache

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


2
2017-10-14 20:38





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

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

इस समस्या को हल करने के लिए, आपको क्लाइंट को फ़ाइलों को अक्षम करने के लिए कर्नेल sendfile समर्थन को अक्षम करने की आवश्यकता है 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


2
2017-12-13 14:03





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

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

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


1
2017-12-28 01:47