नगीनक्स कैश को कैसे साफ़ करें?


250

मैं nginx का उपयोग फ्रंट सर्वर के रूप में करता हूं, मैंने CSS फाइलों को संशोधित किया है, लेकिन nginx अभी भी पुराने की सेवा कर रहा है।

मैंने nginx को पुनः आरंभ करने की कोशिश की है, कोई सफलता नहीं मिली है और मैंने Googled किया है, लेकिन इसे खाली करने का कोई वैध तरीका नहीं मिला।

कुछ लेख कहते हैं कि हम केवल कैश निर्देशिका को हटा सकते हैं: var/cache/nginxलेकिन मेरे सर्वर पर ऐसी कोई निर्देशिका नहीं है।

अब मुझे क्या करना चाहिए?


1
आपके Nginx कॉन्फ़िगरेशन पर अधिक जानकारी से बहुत मदद मिलेगी। क्या आप उपयोग कर रहे हैं proxy_cache?
अलेक्जेंडर अजरोव

नहीं, मैंने केवल डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग किया था, और मैंने स्ट्रिंग के बारे में खोज की cache, इसे विन्यास फाइल में नहीं मिला
फ्रीविन्ड

5
Nginx डिफ़ॉल्ट रूप से कैश नहीं करता है।
अलेक्जेंडर अजारोव

30
क्या आप एक वर्चुअलबॉक्स / वैरिएंट vm में चल रहे हैं? यदि ऐसा है, तो Sendfile को बंद करने का प्रयास करें, क्योंकि वे एक साथ अच्छा नहीं खेलते हैं।
कोल्बीजैक

5
क्या आप सुनिश्चित हैं कि कैशिंग nginx पक्ष पर है, फिर? क्या आपने कर्ल जैसे उपकरण के साथ व्यवहार को सत्यापित किया है? अक्सर बार, इस तरह का एक मुद्दा सिर्फ क्लाइंट-साइड कैशिंग एक अद्यतन संसाधन का अनुरोध नहीं करता है क्योंकि यह बताया गया है कि पुराने संसाधन लंबे समय तक अधिकतम समाप्त हो जाएगा; या ऐसा ही कुछ।
kolbyjack

जवाबों:


185

मुझे ठीक वैसी ही समस्या थी - मैं वर्चुअलबॉक्स में अपना नग्नेक्स चला रहा था। मैंने कैशिंग चालू नहीं किया था। लेकिन लगता है जैसे sendfileकरने के लिए स्थापित किया गया था onमें nginx.confऔर है कि समस्या पैदा कर रहा था। @kolbyjack ने टिप्पणियों में इसका उल्लेख किया।

जब मैं बंद हुआ sendfile- यह ठीक काम किया।

यह है क्योंकि:

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

यह इस बग से संबंधित है: https://www.virtualbox.org/ticket/12597



मेरे मामले में, वैकल्पिक समाधान इन फ़ाइल प्रकारों के लिए gzip चालू करना है। किसी भी तरह से समस्या हल हो।
डिंगल

धन्यवाद और जवाब के लिए बहुत kolbyjack। मेरी ज़िंदगी बचाई।
T1000

1
मैंने 'sudo vim /etc/nginx/nginx.conf' का इस्तेमाल किया और 'sendfile on' को 'sendfile off' में बदल दिया
Koray Güclü

12
मैंने भेजना बंद कर दिया। कोई भाग्य नहीं।
मैरूकोबोटिक्स

110

आप फ़ाइल के आधार पर फ़ाइल का उपयोग करके बाईपास / री-कैश भी कर सकते हैं

proxy_cache_bypass $http_secret_header;

और बोनस के रूप में आप इस हेडर को यह देखने के लिए लौटा सकते हैं कि क्या आपको यह कैश से मिला है ('HIT') या कंटेंट सर्वर से ('BYPASS' वापस आएगा)।

add_header X-Cache-Status $upstream_cache_status;

कैश्ड फ़ाइल को समाप्त / ताज़ा करने के लिए, कैश किए गए पृष्ठ पर अनुरोध करने के लिए कर्ल या किसी भी बाकी क्लाइंट का उपयोग करें।

curl http://abcdomain.com/mypage.html -s -I -H "secret-header:true"

यह आइटम की एक नई प्रति लौटाएगा और यह भी बदल देगा कि कैश में क्या है।


7
मैं केवल एक ही बार इसे क्यों बढ़ा सकता हूं? मैं एक गजली करना चाहता हूं :)
स्पॉक

2
यह केवल कैश्ड पृष्ठों को तब अपडेट कर सकता है जब नया पेज भी उपलब्ध हो। यदि आपने एक पृष्ठ (404 या अन्य त्रुटियों को अब बैकएंड द्वारा परोसा जाता है) को हटा दिया है, तो पृष्ठ अब एक सेट-कुकी या "सामग्री-नियंत्रण: निजी" शीर्ष लेख भेजता है, कैश्ड सामग्री "अमान्य" नहीं होगी।
rbu

3
यह "add_header X-Cache-Status $ upstream_cache_status;" इस तरह की एक अच्छी सुविधा है!
मैक्सिम मासियुटिन

1
बहुत बहुत धन्यवाद। कैश अमान्यकरण के लिए अच्छा टिप, nginx के बारे में बहुत कम ट्यूटोरियल है
इवान सेमोकिन

4
क्या आपने पोस्ट करने के बाद इसे बदला है? मैं सफलतापूर्वक "गुप्त-हेडर" के साथ एक नई प्रतिलिपि प्राप्त कर सकता हूं, लेकिन जैसे ही मैं हेडर निकालता हूं, मुझे फिर से कैश्ड संस्करण मिलता है ...
प्लक

60

जब तक आपने प्रॉक्सी_cache_path के माध्यम से कैश ज़ोन को कॉन्फ़िगर नहीं किया और तब इसका उपयोग किया (उदाहरण के लिए किसी स्थान ब्लॉक में), के माध्यम से: प्रॉक्सी_के कैश कुछ भी कैश नहीं होगा।

यदि आपने किया है, तो nginx के लेखक के अनुसार , बस कैश डायरेक्टरी से सभी फ़ाइलों को हटाने के लिए पर्याप्त है।

सबसे सरल तरीका: find /path/to/your/cache -type f -delete


मैं फ़ाइलों को हटाने के बाद मेरी त्रुटि लॉग में यह कर रहा हूँ:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin एंडरसन

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

1
हाँ, जब भी मैं कोई परिवर्तन लागू करता हूं, मैं अपनी वेबसाइट के लिए कैश को स्वचालित रूप से एक स्क्रिप्ट द्वारा साफ़ कर देता हूं, और nginx को फिर से लोड करना भी इसे ठीक नहीं करता है।
कोलिन एंडरसन

यदि आप प्रॉक्सी सामान का उपयोग नहीं करते हैं, तो भी Nop Nginx कुछ को कैश करता है, लेकिन यह Nginx + VirtualBox के साथ एक बग है।
थॉमस डेकाक्स

1
यह अस्पष्ट लगता है। क्या आप इसे विस्तार से समझा सकते हैं? ऐसा नहीं लगता कि यह यहाँ विषय से संबंधित है।
गर्नफ़ोज़

20

आप nginx की कैश निर्देशिका को हटा सकते हैं या आप विशिष्ट फ़ाइल खोज सकते हैं:

grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*

और केवल एक फ़ाइल को हटा दें nginx उन्हें ताज़ा करें।


1
सटीक हिट पाने के लिए, आप खोज शब्द में $ जोड़ सकते हैं । जैसेgrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
जिफेंग झांग

1
दुर्भाग्य से मुझे निम्नलिखित उत्पादन मिला है grep: /var/nginx/cache/*: No such file or directoryमैं Ubuntu 14.04.3 LTS और nginx / 1.8.1 का उपयोग कर रहा हूं। कोई उपाय?
b00r00x0

निम्नलिखित फ़ाइलों को grep / var / nginx / cache के लिए sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
आज़माएँ

मेरा मानना ​​है कि यह / var / cache / nginx / * (रास्ते में nginx से पहले dir कैश)
रैंडी लैम

15

इस प्रश्न के दो उत्तर हैं।

  • नगनेक्स के लिए रिवर्स कैश के रूप में
  • हेडर इनपुट द्वारा ब्राउज़र कैश को साफ करने के लिए एक और (यह एक)

उपयोग:

expires modified +90d;

ईजी:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}

मैंने इस कार्यान्वयन की कोशिश की क्योंकि मैं इसी तरह का मुद्दा रहा हूं। हालाँकि, मैंने परिवर्तन करने के बाद - यह डिफ़ॉल्ट Nginx पृष्ठ को दिखाता है। मैं प्रॉक्सी के साथ Niginx को LB के रूप में उपयोग कर रहा हूं, क्या मुझे रूट बदलने की आवश्यकता हो सकती है?
एरोन

10

मुझे यह उपयोगी लगा

grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm

खोजें, और यदि मिला तो हटा दें।


9

मेरे नगीने में मैंने पाया कि मुझे जाना था:

/opt/nginx/cache

तथा

sudo rm -rf *

उस निर्देशिका में। यदि आप अपने nginx स्थापित करने के लिए रास्ता जानते हैं और कैश निर्देशिका पा सकते हैं तो वही आपके लिए काम कर सकता है। Be बहुत सावधान साथ rm -rfआदेश, यदि आप गलत निर्देशिका में हैं आप अपने पूरे हार्ड ड्राइव हटा सकते हैं।


2
आपको उसके बाद NGINX को पुनः आरंभ करने की आवश्यकता है
Eliel Haouzi

और वह बुरा हिस्सा है
kidz

9

मैं एक बहुत ही सरल बैश स्क्रिप्ट चलाता हूं जो काम करने में 10 सेकंड का समय लेता है और काम पूरा होने पर मुझे एक मेल भेजता है।

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" me@gmail.com
exit 0

8

मुझे भी यह समस्या थी।

  • कोई nginx / cache फ़ोल्डर नहीं मिल सका
  • प्रेषक बंद था

मेरा डोमेन cloudflare.com का उपयोग करता है DNS (महान सेवा!) के लिए । अहा! वहाँ था:

cloudflare.com -> कैशिंग -> पर्ज कैश (मैंने सब कुछ शुद्ध किया) जिसने मेरी समस्या हल कर दी!


2
यह Cloudflare के एज कैश को शुद्ध करता है। यह अपने स्वयं के सर्वर पर Nginx कैश को साफ़ नहीं करता है।
Mahemoff

एक सलाह के रूप में, मुझे लगता है कि एक वैध जवाब है।
फर्नांडो कोश

यह उत्कृष्ट उत्तर था। मैं घंटों खुदाई कर रहा था कि क्यों कुछ फाइलें अभी भी कैश की जा रही हैं और यह अंदाजा नहीं लगा सकता कि यह CloudFlare 'गलती' है। धन्यवाद!
अपरिभाषित

6

हमारे पास एक बहुत बड़ा नगनेक्स कैश (गीगाबाइट) है जिसे हमें कभी-कभी पोंछना पड़ता है। मैंने एक स्क्रिप्ट पर काम किया है जो तुरंत कैश को साफ़ करता है (जहाँ तक Nginx का संबंध है) और फिर डिस्क I / O के लिए मुख्य एप्लिकेशन को भूखे बिना कैश डायरेक्टरी को हटा देता है।

संक्षेप में:

  1. कैश फ़ोल्डर को एक नए स्थान पर ले जाएं (एक ही फाइल सिस्टम पर!) (यह किसी भी ओपन फाइल डिस्क्रिप्टर को बाधित नहीं करता है)
  2. मूल कैश फ़ोल्डर को फिर से बनाएँ, खाली
  3. रीलोडेड नेग्नेक्स ( सुशोभित) पुनः लोड, जहां नेग्नेक्स पुराने श्रमिकों को प्रगति के अनुरोधों को पूरा करने देता है)
  4. पुराने कैश्ड डेटा को हटा दें

यहाँ की स्क्रिप्ट, Ubuntu 16.04 LTS के अनुरूप है, जिसमें कैश स्थित है /mnt/nginx-cache:

#!/bin/bash
set -e

TMPCACHE=`mktemp --directory --tmpdir=/mnt nginx-cache-XXXXXXXXXX`
TMPTEMP=`mktemp --directory --tmpdir=/mnt nginx-temp-XXXXXXXXXX`

# Move the old cache folders out of the way
mv /mnt/nginx-cache $TMPCACHE
mkdir -p /mnt/nginx-cache
chmod -R 775 /mnt/nginx-cache
chown www-data:www-data /mnt/nginx-cache

mv /mnt/nginx-temp $TMPTEMP
mkdir -p /mnt/nginx-temp
chmod -R 775 /mnt/nginx-temp
chown www-data:www-data /mnt/nginx-temp

# Tell Nginx about the new folders.
service nginx reload

# Create an empty folder.
rm -rf /mnt/empty
mkdir -p /mnt/empty

# Remove the old cache and old temp folders w/o thrashing the disk...
# See http://serverfault.com/questions/546177/how-to-keep-subtree-removal-rm-rf-from-starving-other-processes-for-disk-i
# Note: the `ionice` and `nice` may not actually do much, but why not?
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPCACHE
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPTEMP
rm -rf $TMPCACHE
rm -rf $TMPTEMP

rm -rf /mnt/empty

और अगर यह मददगार है, तो यहाँ Nginx config का उपयोग करें:

upstream myapp {
    server localhost:1337 fail_timeout=0;
}

proxy_cache_path /mnt/nginx-cache/app levels=2:2:2 keys_zone=app_cache:100m inactive=1y max_size=10g;
proxy_temp_path  /mnt/nginx-temp/app;

server {
    listen   4316 default;
    server_name  myapp.com;

    location / {
        proxy_pass http://appserv;
        proxy_cache app_cache;
        proxy_cache_valid 200 1y;
        proxy_cache_valid 404 1m;
    }
}

5

उन लोगों के लिए जो अन्य समाधान काम नहीं कर रहे हैं, जांचें कि क्या आप CloudFlare जैसी DNS सेवा का उपयोग कर रहे हैं । उस स्थिति में "विकास मोड" को सक्रिय करें या "पर्ज कैश" टूल का उपयोग करें।


5

कृपया ध्यान दें कि अगर आपका ऐप उस विशिष्ट अनुरोध के लिए अस्वीकार्य प्रतिक्रिया नहीं देता है जहां आप उसे ट्रिगर करते हैं, तो प्रॉक्सी_कैचे_बिपास आपको चोट की दुनिया दे सकता है।

यदि उदाहरण के लिए आपका ऐप हर पहले अनुरोध के साथ एक कुकी भेजता है, तो एक स्क्रिप्ट जो कर्ल के माध्यम से प्रॉक्सी_पास_बीपास को ट्रिगर करती है, शायद उस कुकी को जवाब में मिल जाएगी, और नगनेक्स कैश्ड आइटम को रीफ्रेश करने के लिए उस प्रतिक्रिया का उपयोग नहीं करेगा ।


3
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

सही पथ को ठीक से निर्दिष्ट करने के लिए सावधान रहें।


3

उन लोगों के लिए, जिन्होंने nginx कैश फ़ाइलों को हटाने की कोशिश की है, और या तो यह काम नहीं किया है या रुक-रुक कर काम किया है, ओपन_फाइल_चेचे के लिए आपकी सेटिंग पर एक नज़र है। यदि यह किसी फ़ाइल डिस्क्रिप्टर को लंबे समय तक कैश करने के लिए सक्षम और कॉन्फ़िगर किया गया है, तो डिस्क से हटाए जाने के बाद भी Nginx को कैश्ड फ़ाइल का एक संस्करण दिखाई दे सकता है। मुझे open_file_cache_valid को 1s कम करना था (मुझे यकीन नहीं है कि यह अनिवार्य रूप से फ़ाइल कैश को पूरी तरह से अक्षम करने के समान है)।


2

मेरे सर्वर पर, nginx कैश फ़ोल्डर है /data/nginx/cache/

इसलिए मैंने इसे केवल हटा दिया: sudo rm -rf /data/nginx/cache/

आशा है कि यह किसी की मदद करेगा।


2

यदि आप विशिष्ट फ़ाइलों के कैश को साफ़ करना चाहते हैं तो आप proxy_cache_bypassनिर्देश का उपयोग कर सकते हैं । इसे आपको इसी तरह करना होगा

location / {
    proxy_cache_bypass $cookie_nocache $arg_nocache;
    # ...
}

अब यदि आप चाहते हैं कि आप कैश को बायपास कर दें तो आप फाइल को एक्सेस कर सकते हैं

http://www.example.com/app.css?nocache=true


1
मुझे लगता है कि इसका उपयोग आपकी वेबसाइट में बैंडविड्थ पर हमला करने और उपभोग करने के लिए किया जा सकता है।
Marcelo Agimóvel

1
क्या यह केवल वर्तमान अनुरोध ( app.css?nocache=true) के लिए कैश को बायपास नहीं करता है जबकि मूल फ़ाइल (क्वेरी के बिना) कैश में बनी रहती है ( app.css)?
adrianTNT

1

आप निम्न की तरह nginx.conf में कॉन्फ़िगरेशन जोड़ सकते हैं।

...
http {
proxy_cache_path  /tmp/nginx_cache levels=1:2 keys_zone=my-test-cache:8m max_size=5000m inactive=300m;

server {
    proxy_set_header X- Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_cache my-test-cache;
    proxy_cache_valid  200 302  1m;
    proxy_cache_valid  404      60m;
    proxy_cache_use_stale   error timeout invalid_header updating;
    proxy_redirect off;

    ....
}
...
}

ऊपर से, "nginx_cache" नामक एक फ़ोल्डर गतिशील रूप से / tmp / में कैश्ड सामग्री को संग्रहीत करने के लिए बनाया गया है।


1

केवल कैश-फ़ाइलों को हटाने के लिए एक सही तरीका है, जो किसी भी कुंजी से मेल खाता है। उदाहरण के लिए:

grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf

यह सभी कैश-फाइल्स को हटा देता है, जो कि nginx.conf में सेट होने पर "yahoo / *" से मेल खाता है:

proxy_cache_key $host$uri;

1

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

https://github.com/zafergurel/nginx-cache-cleaner

विचार सरल है। कैश की एक इंडेक्स बनाने के लिए (कैशे कीज़ और संबंधित कैशे फ़ाइलों के साथ) और इस इंडेक्स फ़ाइल में खोजें। इसने वास्तव में वस्तुओं को खोजने में तेजी लाने में मदद की (मिनट से लेकर उप-सेकंड तक) और तदनुसार उन्हें हटाने के लिए।


1

मेरे मामले में, touchवह सीएसएस फ़ाइल, ऐसा लगता है कि संसाधनों में बदलाव हुआ है (वास्तव touchमें फ़ाइल के लिए कुछ भी नहीं होता है, अंतिम बार संशोधित समय को छोड़कर), इसलिए ब्राउज़र और नेग्नेक्स नवीनतम संसाधन लागू करेंगे


0

मैं इसी तरह की समस्या का सामना कर रहा था:

सिस्टम सेटअप और समस्या: (एक वर्चुअलबॉक्स पर मैं ubuntu और nginx का उपयोग करके वेब होस्टिंग कर रहा हूं - PHP वेबपेज रिफ्रेश बाहरी सीएसएस फ़ाइल में परिवर्तन को प्रतिबिंबित नहीं करता है)। मैं विंडोज़ मशीन पर वेबसाइट विकसित कर रहा हूं और साझा किए गए फ़ोल्डर के माध्यम से फाइल को nginx में स्थानांतरित कर रहा हूं। ऐसा लगता है कि nginx css फ़ाइल में परिवर्तन नहीं करता है (किसी भी फैशन में ताज़ा करने से कोई मदद नहीं मिलती है। css फ़ाइल का नाम बदलना केवल वह चीज़ है जो काम की है)

समाधान: VM पर साझा फ़ाइल (मेरे मामले में सीएसएस फ़ाइल) ढूंढें। नैनो के साथ खोलें और विंडोज़ शेयर में फ़ाइल की तुलना करें (वे समान दिखाई देते हैं)। वीएम सेव नैनो के साथ साझा फ़ाइल। सभी परिवर्तन अब ब्राउज़र में परिलक्षित होते हैं। यकीन नहीं होता कि यह क्यों काम करता है लेकिन इसने मेरे मामले में काम किया है।

अद्यतन: VM सर्वर को रिबूट करने के बाद समस्या वापस आ गई। समाधान के तहत निर्देशों का पालन करते हुए फिर से अपडेट के लिए सीएसएस को उत्तरदायी बनाया


-1

मेरे मामले में यह /etc/php/7.2/fpm/php.ini (Ubuntu) में सक्षम opcache था:

opcache.enable=1

इसे 0 पर सेट करने से सर्वर (php) फ़ाइलों का नवीनतम संस्करण लोड हो रहा है।

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