Nginx'in önbelleğini nasıl temizleyebilirim?


250

Ön sunucu olarak nginx kullanıyorum, CSS dosyalarını değiştirdim, ancak nginx hala eskilerine hizmet veriyor.

Başarısız olmak için nginx'i yeniden başlatmayı denedim ve Googled'i buldum, ancak temizlemek için geçerli bir yol bulamadım.

Bazı makaleler sadece önbellek dizinini silebileceğimizi söylüyor: var/cache/nginxancak sunucumda böyle bir dizin yok.

Ben şimdi ne yapmalıyım?


1
Nginx yapılandırmanızla ilgili daha fazla ayrıntı çok yardımcı olacaktır. Kullanıyor musunuz proxy_cache?
Alexander Azarov

Hayır, yalnızca varsayılan yapılandırmayı kullandım ve dizeyi araştırdım cache, yapılandırma dosyalarında
bulamadım

5
Nginx varsayılan olarak önbelleklemez.
Alexander Azarov

30
Virtualbox / Vargant VM'de mi çalışıyorsunuz? Öyleyse, birlikte iyi oynamadıkları için sendfile'ı kapatmayı deneyin.
kolbyjack

5
önbelleğin nginx tarafında olduğundan emin misin? Davranışı curl gibi bir araçla doğruladınız mı? Çoğu zaman, bunun gibi bir sorun, güncellenmiş bir kaynak istemeyen istemci tarafı önbelleğe almadır, çünkü eski kaynağın uzun bir süre boyunca maks. Veya benzeri.
kolbyjack

Yanıtlar:


185

Aynı sorunu yaşadım - nginx'imi Virtualbox'ta çalıştırıyordum. Önbelleğe alma özelliği açık değildi. Ama oluşacağı sendfileolarak ayarlandı oniçinde nginx.confve soruna neden olduğunu. @kolbyjack yukarıda yorumlarda bahsetti.

Kapattığımda sendfile- iyi çalıştı.

Bunun nedeni ise:

Sendfile 'bir dosya tanımlayıcı ile diğeri arasında veri kopyalamak için' kullanılır ve görünüşe göre bir sanal makine ortamında veya en azından Virtualbox üzerinden çalıştırıldığında bazı gerçek problemleri vardır. Nginx'te bu yapılandırmanın kapatılması, statik dosyanın farklı bir yöntemle sunulmasına neden olur ve değişiklikleriniz hemen ve soru olmadan yansıtılır

Bu hatayla ilgilidir: https://www.virtualbox.org/ticket/12597



Benim durumumda, alternatif çözüm bu dosya türleri için gzip'i açmaktır. Her iki durumda da sorun çözüldü.
Dingle

Cevap için teşekkürler ve kolbyjack. Hayatımı kurtardı.
T1000

1
'Sudo vim /etc/nginx/nginx.conf' komutunu izledim ve 'sendfile on'u' sendfile off 'olarak değiştirdim
Koray Güclü

12
Sendfile kapattım. Şanssız.
marukobotto

110

Ayrıca, bir dosyayı dosya bazında bypass edebilir / önbelleğe alabilirsiniz.

proxy_cache_bypass $http_secret_header;

ve bonus olarak bu üstbilgiyi önbellekten ('HIT' döndürür) veya içerik sunucusundan ('BYPASS' döndürür) alıp almadığınızı görmek için döndürebilirsiniz.

add_header X-Cache-Status $upstream_cache_status;

önbelleğe alınan dosyanın süresinin dolması / yenilenmesi için önbelleğe alınan sayfaya istekte bulunmak için curl veya herhangi bir kalan istemciyi kullanın.

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

bu, öğenin yeni bir kopyasını döndürür ve ayrıca önbellekteki içeriği değiştirir.


7
Neden sadece bir kez vekalet edebilirim? Ben bir gazilyon yapmak istiyorum :)
Spock

2
Bu, yalnızca yeni sayfa da önbelleklenebilir olduğunda önbelleğe alınmış sayfaları güncelleyebilir. Bir sayfayı kaldırdıysanız (şimdi arka uç tarafından 404 veya başka hatalar sunulur), sayfa şimdi bir Set-Cookie veya "Content-Control: private" üstbilgisi gönderir, önbelleğe alınan içerik "geçersiz kılınmaz".
rbu

3
Bu "add_header X-Cache-Status $ upstream_cache_status;" harika bir özellik!
Maxim Masiutin

1
çok teşekkürler. önbellek geçersiz kılma için güzel bir ipucu, nginx hakkında çok az öğretici var
Ivan Semochkin

4
Gönderdiğinizden beri bu değişti mi? "Gizli başlık" ile başarılı bir şekilde yeni bir kopya alabilirim, ancak başlığı kaldırır kaldırmaz önbelleğe alınmış sürümü tekrar
alıyorum

60

Bir önbellek bölgesini proxy_cache_path aracılığıyla yapılandırıp daha sonra (örneğin bir konum bloğunda) kullanmadığınız sürece , proxy_cache yoluyla hiçbir şey önbelleğe alınmaz .

Ancak bunu yaptıysanız, nginx'in yazarına göre , tüm dosyaları önbellek dizininden kaldırmak yeterlidir.

En basit yol: find /path/to/your/cache -type f -delete


dosyaları sildikten sonra hata günlüğümde bunu alıyorum:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson

Tekrar tekrar mı, yoksa sadece bir kez mi? Gerçek bir sorun olmamalı. Muhtemelen, önbellek yöneticisinin zaten sildiğiniz bir dosyayı silmeye çalıştığı anlamına gelir. Belki mesajı tekrar tekrar alırsanız nginx (nginx -s reload) öğesinin yeniden yüklenmesi yardımcı olabilir. (Bunun da önbellek yöneticisini sıfırlayıp sıfırlamayacağından emin değilim.)
Gnarfoz

1
Evet, her değişiklik yaptığımda web sitemin önbelleğini bir komut dosyasıyla otomatik olarak temizlerim ve nginx'i yeniden yüklemek de düzeltmez.
Collin Anderson

Nop Nginx, proxy şeyler kullanmasanız bile bir şey önbelleğe alır, ancak bu Nginx + VirtualBox ile ilgili bir hatadır.
Thomas Decaux

1
Kulağa oldukça belirsiz geliyor. Bunu biraz açıklayabilir misiniz? Buradaki konu ile ilgili görünmüyor.
Gnarfoz

20

Nginx'in önbellek dizinini silebilir veya Belirli bir dosyayı arayabilirsiniz:

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

Ve nginx yenilemek için sadece bir dosya silin.


1
Tam isabeti almak için arama terimine $ ekleyebilirsiniz . Beğengrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang

1
Ne yazık ki aşağıdaki çıktı var grep: /var/nginx/cache/*: No such file or directoryBen Ubuntu 14.04.3 LTS ve nginx / 1.8.1 kullanıyorum. Herhangi bir fikir?
b00r00x0

/ Var / nginx / cache altındaki dosyaları grep için deneyin:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

Onun '/ var / cache / nginx / * (yoldaki nginx önce dir önbellek) iman
Randy Lam

15

Bu soruda iki cevap var.

  • Biri nginx için ters önbellek olarak
  • Bir başkası tarayıcı önbelleğini başlık girişi ile temizlemek için (bu bir)

kullanın:

expires modified +90d;

ÖRNEĞİN:

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

Ben benzer bir sorun yaşıyorum çünkü bu uygulamayı denedim. Ancak, değişikliği yaptıktan sonra - varsayılan Nginx sayfasını gösterir. Ben proxy ile Niginx LB olarak kullanıyorum, belki kök değiştirmek gerekir?
Aaron

10

Bunu yararlı buldum

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

Arama yapın ve bulunursa silin.


9

Benim nginx kurulumunda ben gitmek zorunda bulundu:

/opt/nginx/cache

ve

sudo rm -rf *

bu dizinde. Nginx kurulumunuzun yolunu biliyorsanız ve önbellek dizinini bulabiliyorsanız, bu sizin için de işe yarayabilir. Be çok dikkatli ile rm -rfyanlış dizinde ise sizin tüm sabit sürücü silebilir, komuta.


2
bundan sonra NGINX'i yeniden başlatmanız gerekiyor
Eliel Haouzi

Ve bu kötü kısım
kidz

9

İşi yapmak için 10 saniyenin hepsini alan ve bittiğinde bana bir posta gönderen çok basit bir bash betiği çalıştırıyorum.

#!/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

Ben de bu sorunu yaşadım.

  • Herhangi bir nginx / cache klasörü bulunamadı
  • sendfile kapalı

Alan adım DNS için cloudflare.com kullanıyor (mükemmel hizmet!). Aha! İşte oradaydı:

cloudflare.com -> önbellekleme -> Önbelleği Temizle (Her şeyi temizledim) Bu sorunumu çözdü!


2
Bu, Cloudflare'nin kenar önbelleklerini temizler. Kendi sunucunuzdaki Nginx önbelleğini temizlemez.
mahemoff

Bir tavsiye olarak, geçerli bir cevap olduğunu düşünüyorum.
Fernando Kosh

Bu mükemmel bir cevaptı. Neden bazı dosyaların hala önbelleğe alındığını ve CloudFlare 'hata' olduğunu tahmin edemedim saat kazıyordum. Teşekkürler!
undefinedman

6

Ara sıra silmemiz gereken çok büyük bir nginx önbelleğimiz (gigabayt) var. Anında (Nginx söz konusu olduğunda) önbelleği temizler ve daha sonra disk G / Ç için ana uygulama aç olmadan önbellek dizinini kaldırır bir komut dosyası çalıştım.

Özetle:

  1. Önbellek klasörünü yeni bir konuma taşıyın (aynı dosya sisteminde!) (Bu, açık dosya tanımlayıcılarını bozmaz)
  2. Orijinal önbellek klasörünü yeniden oluşturun, boş
  3. Nginx'i yeniden yükle ( nginx'in eski çalışanların devam eden istekleri bitirmesine izin verdiği zarif yeniden yükleme)
  4. Eski önbelleğe alınmış verileri kaldırma

Ubuntu 16.04 LTS'ye uyarlanmış komut dosyası şöyledir /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

Ve yararlı olması durumunda, kullandığımız Nginx yapılandırması:

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

Diğer çözümlerin çalışmadığı kişiler için CloudFlare gibi bir DNS hizmeti kullanıp kullanmadığınızı kontrol edin . Bu durumda "Geliştirme Modu" nu etkinleştirin veya "Önbelleği Temizle" aracını kullanın.


5

Uygulamanız tetiklediğiniz belirli bir istek için önbelleğe alınabilir bir yanıt döndürmezse, proxy_cache_bypass öğesinin size bir zarar dünyası verebileceğini lütfen unutmayın.

Örneğin uygulama her ilk isteğiyle bir çerez gönderirse, tetikleyiciler kıvrılma yoluyla proxy_pass_bypass senaryo muhtemelen cevap bu çerez alacak ve nginx olacak değil önbelleğe öğeyi yenilemek için bu tepkiyi kullanın.


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

Doğru yolu doğru bir şekilde belirtmeye dikkat edin.


3

Nginx önbellek dosyalarını silmeyi deneyen ve ya çalışmayan ya da aralıklı çalışanlar için, open_file_cache ayarınıza bir göz atın. Bu, bir dosya tanımlayıcıyı uzun süre önbelleğe alacak şekilde etkinleştirilir ve yapılandırılırsa, Nginx, diskten sildikten sonra bile önbelleğe alınan dosyanın bir sürümünü görebilir. 1s için open_file_cache_valid azaltmak zorunda kaldım (bu aslında dosya önbelleğini tamamen devre dışı bırakma ile aynı olup olmadığından emin değilim).


2

Sunucumda, nginx önbellek klasörü /data/nginx/cache/

Bu yüzden sadece kaldırdım: sudo rm -rf /data/nginx/cache/

Umarım bu herkese yardımcı olur.


2

Belirli dosyaların önbelleğini temizlemek istiyorsanız, proxy_cache_bypassyönergeyi kullanabilirsiniz . Bunu böyle yapıyorsun

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

Şimdi önbelleği atlamak istiyorsanız, nocache parametresini geçirerek dosyaya erişirsiniz

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


1
Sanırım bu, web sitenizdeki bant genişliğine saldırmak ve tüketmek için kullanılabilir.
Marcelo Agimóvel

1
app.css?nocache=trueOrijinal dosya (sorgu olmadan) önbellekte ( app.css) kalırken geçerli istek ( ) için önbelleği atlamıyor mu?
adrianTNT

1

Nginx.conf dosyasına aşağıdaki gibi bir yapılandırma ekleyebilirsiniz.

...
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;

    ....
}
...
}

Yukarıdan, "nginx_cache" adlı bir klasör, önbelleğe alınmış içeriği depolamak için / tmp / dizininde dinamik olarak oluşturulur.


1

Herhangi bir KEY ile eşleşen yalnızca önbellek dosyalarını kaldırmak için doğru bir yöntem vardır. Örneğin:

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

Eğer nginx.conf içinde ayarlanmışsa KEY "yahoo / *" ile eşleşen tüm önbellek dosyalarını kaldırır:

proxy_cache_key $host$uri;

1

Birçok şeyi önbelleğe almak için nginx kullanıyoruz. Önbellek dizininde on binlerce öğe var. Öğeleri bulmak ve silmek için, bu işlemi basitleştirmek üzere bazı komut dosyaları geliştirdik. Bu komut dosyalarının deposunu aşağıda bulabilirsiniz:

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

Fikir basit. Önbellek dizini oluşturmak için (önbellek anahtarları ve karşılık gelen önbellek dosyaları ile) ve bu dizin dosyasında arama yapın. Öğeleri bulmamızı hızlandırmamıza (dakikadan alt saniyeye) gerçekten yardımcı oldu ve bunları uygun şekilde sildi.


1

Benim durumumda, touchbu Css dosyası, kaynakların değişmiş gibi görünmesini sağlayın (aslında touchson değişiklik zamanını değiştirmek dışında hiçbir şey yapmaz), bu nedenle tarayıcı ve nginx en son kaynakları uygular


0

Benzer bir sorun yaşıyordum:

Sistem kurulumu ve Sorun: (Bir sanal kutuda ubuntu ve nginx kullanarak web barındırma yapıyorum - PHP web sayfası yenilemeleri harici css dosyasındaki değişiklikleri yansıtmadı). Windows makinesinde web sitesi geliştiriyorum ve paylaşılan klasör üzerinden nginx'e dosya aktarıyorum. Nginx css dosyasındaki değişiklikleri almıyor gibi görünüyor (herhangi bir şekilde yenilenmesi yardımcı olmaz. Css dosya adını değiştirmek işe yarayan tek şeydir)

Çözüm: VM'de paylaşılan dosyayı bulun (benim durumumda css dosyası). Nano ile açın ve Windows paylaşımındaki dosya ile karşılaştırın (aynı görünürler). VM'de paylaşılan dosyayı nano ile kaydedin. Tüm değişiklikler artık tarayıcıya yansıtılıyor. Bunun neden çalıştığından emin değilim ama benim durumumda yaptı.

GÜNCELLEME: VM sunucusunu yeniden başlattıktan sonra sorun geri döndü. Çözüm altındaki talimatları izleyerek css güncellemelere tekrar yanıt verdi


-1

Benim durumumda /etc/php/7.2/fpm/php.ini (Ubuntu) içinde etkinleştirilmiş opcache oldu:

opcache.enable=1

0 olarak ayarlandığında, sunucu (php) dosyalarının en son sürümünü yükledi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.