Bagaimana cara menghapus cache nginx?

250

Saya menggunakan nginx sebagai server depan, saya telah memodifikasi file CSS, tetapi nginx masih melayani yang lama.

Saya telah mencoba untuk me-restart nginx, tidak berhasil dan saya telah Googled, tetapi tidak menemukan cara yang valid untuk menghapusnya.

Beberapa artikel mengatakan kami hanya dapat menghapus direktori cache:, var/cache/nginxtetapi tidak ada direktori seperti itu di server saya.

Apa yang harus saya lakukan sekarang?

Freewind
sumber
1
Rincian lebih lanjut tentang konfigurasi Nginx Anda akan sangat membantu. Apakah Anda menggunakan proxy_cache?
Alexander Azarov
Tidak, saya hanya menggunakan konfigurasi default, dan saya mencari tentang string cache, tidak menemukannya di file konfigurasi
Freewind
5
Nginx tidak melakukan cache secara default.
Alexander Azarov
30
Apakah Anda menjalankan di virtualbox / vargant vm? Jika demikian, coba matikan sendfile, karena mereka tidak bermain bersama dengan baik.
kolbyjack
5
apakah Anda yakin caching ada di sisi nginx? Sudahkah Anda memverifikasi perilaku dengan alat seperti ikal? Sering kali, masalah seperti ini hanya caching sisi-klien yang tidak meminta sumber daya yang diperbarui karena telah diberitahukan bahwa sumber daya lama akan valid untuk waktu yang lama dengan kadaluarsa maks; atau yang serupa.
kolbyjack

Jawaban:

185

Saya memiliki masalah yang sama persis - saya menjalankan nginx saya di Virtualbox. Caching saya tidak dihidupkan. Tapi tampak seperti sendfileditetapkan untuk ondi nginx.confdan yang menyebabkan masalah. @ Kolbyjack menyebutkannya di atas dalam komentar.

Ketika saya mematikan sendfile- itu bekerja dengan baik.

Hal ini karena:

Sendfile digunakan untuk 'menyalin data antara satu file deskriptor dan yang lain' dan tampaknya memiliki beberapa masalah nyata ketika dijalankan di lingkungan mesin virtual, atau setidaknya ketika dijalankan melalui Virtualbox. Mematikan konfigurasi ini di nginx menyebabkan file statis dilayani melalui metode yang berbeda dan perubahan Anda akan segera tercermin dan tanpa pertanyaan

Ini terkait dengan bug ini: https://www.virtualbox.org/ticket/12597

Deepan Chakravarthy
sumber
7
Lihat tautan
Sian Lerk Lau
Dalam kasus saya, solusi alternatifnya adalah mengaktifkan gzip untuk jenis file ini. Either way masalahnya diselesaikan.
Dingle
Terima kasih dan kolbyjack atas jawabannya. Menyelamatkan hidupku.
T1000
1
Saya menggunakan mengikuti 'sudo vim /etc/nginx/nginx.conf' dan mengubah 'sendfile on' menjadi 'sendfile off'
Koray Güclü
12
Saya mematikan sendfile. Tidak berhasil
marukobotto
110

Anda juga dapat mem-by-cache menggunakan file per file

proxy_cache_bypass $http_secret_header;

dan sebagai bonus Anda dapat mengembalikan tajuk ini untuk melihat apakah Anda mendapatkannya dari cache (akan mengembalikan 'HIT') atau dari server konten (akan mengembalikan 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

untuk kedaluwarsa / menyegarkan file yang di-cache, gunakan curl atau klien lainnya untuk membuat permintaan ke halaman yang di-cache.

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

ini akan mengembalikan salinan item yang baru dan juga akan menggantikan apa yang ada di cache.

Jason Wiener
sumber
7
Mengapa saya hanya dapat memilih ulang kali ini saja? Saya ingin melakukan trilyun :)
Spock
2
Ini hanya dapat memperbarui halaman yang di-cache ketika halaman baru juga dapat di-cache. Jika Anda telah menghapus halaman (404 atau kesalahan lainnya sekarang dilayani oleh backend), halaman tersebut sekarang mengirimkan header Set-Cookie atau header "Content-Control: private", konten yang di-cache tidak akan "invalidated".
rbu
3
Ini "add_header X-Cache-Status $ upstream_cache_status;" adalah fitur yang sangat keren!
Maxim Masiutin
1
Terima kasih banyak. tip yang bagus untuk pembatalan cache, ada begitu sedikit tutorial tentang nginx
Ivan Semochkin
4
Apakah ini sudah berubah sejak Anda memposting? Saya dapat berhasil mendapatkan salinan baru dengan "header-rahasia" tetapi segera setelah saya menghapus header, saya mendapatkan versi cache lagi ...
Pluc
60

Kecuali Anda mengkonfigurasi zona cache melalui proxy_cache_path dan kemudian menggunakannya (misalnya di blok lokasi), melalui: proxy_cache tidak ada yang akan di-cache.

Namun, jika Anda melakukannya, maka menurut penulis nginx , cukup menghapus semua file dari direktori cache sudah cukup.

Cara termudah: find /path/to/your/cache -type f -delete

Gnarfoz
sumber
Saya mendapatkan ini di log kesalahan saya setelah menghapus file:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson
Berulang kali, atau hanya sekali? Seharusnya bukan masalah yang sebenarnya. Itu mungkin hanya berarti bahwa manajer cache mencoba menghapus file yang sudah Anda hapus. Mungkin memuat ulang nginx (nginx -s reload) mungkin membantu jika Anda menerima pesan berulang kali. (Tidak yakin apakah itu menginisialisasi ulang cache manager.)
Gnarfoz
1
ya, saya secara otomatis menghapus cache untuk situs web saya dengan skrip setiap kali saya menerapkan perubahan, dan memuat ulang nginx juga tidak memperbaikinya.
Collin Anderson
Nop Nginx melakukan cache sesuatu bahkan jika Anda tidak menggunakan hal-hal proxy, tapi itu bug dengan Nginx + VirtualBox.
Thomas Decaux
1
Kedengarannya agak kabur. Bisakah Anda menguraikan itu? Sepertinya tidak ada hubungannya dengan topik yang dibahas di sini.
Gnarfoz
20

Anda dapat menghapus direktori cache nginx atau Anda dapat mencari file tertentu:

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

Dan hapus hanya satu file untuk menyegarkan nginx mereka.

Łukasz Sokolik
sumber
1
Untuk mendapatkan klik yang tepat, Anda dapat menambahkan $ ke istilah pencarian. Sepertigrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang
1
Sayangnya saya mendapatkan output berikut grep: /var/nginx/cache/*: No such file or directorysaya menggunakan Ubuntu 14.04.3 LTS dan nginx / 1.8.1. Ada ide?
b00r00x0
Coba yang berikut ini untuk mengambil file di bawah / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau
Saya percaya itu / var / cache / nginx / * (dir cache sebelum nginx di jalan)
Randy Lam
15

Ada dua jawaban dalam pertanyaan ini.

  • Satu untuk nginx sebagai cache terbalik
  • Lain untuk membersihkan cache browser dengan input header (yang ini)

Menggunakan:

expires modified +90d;

MISALNYA:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
deyes
sumber
Saya mencoba implementasi ini karena saya mengalami masalah serupa. Namun, setelah saya melakukan perubahan - ini menunjukkan halaman Nginx default. Saya menggunakan Niginx sebagai LB dengan proxy, apakah saya perlu mengubah root mungkin?
Aaron
10

Saya menemukan ini berguna

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

Cari, dan jika ditemukan maka hapus.

agustik
sumber
9

Di instal nginx saya, saya harus pergi ke:

/opt/nginx/cache

dan

sudo rm -rf *

dalam direktori itu. Jika Anda tahu jalur untuk menginstal nginx Anda dan dapat menemukan direktori cache, hal yang sama juga berlaku untuk Anda. Berhati -hatilah dengan rm -rfperintah tersebut, jika Anda berada di direktori yang salah, Anda dapat menghapus seluruh hard drive Anda.

Ganesh Shankar
sumber
2
Anda harus memulai kembali NGINX setelah itu
Eliel Haouzi
Dan itu bagian yang buruk
kidz
9

Saya menjalankan skrip bash yang sangat sederhana yang membutuhkan waktu 10 detik untuk melakukan pekerjaan itu dan mengirimkan saya surat setelah selesai.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" [email protected]
exit 0
MitchellK
sumber
8

Saya punya masalah ini juga.

  • Tidak dapat menemukan folder nginx / cache
  • sendfile tidak aktif

Domain saya menggunakan cloudflare.com untuk DNS (layanan hebat!). Aha! Itu dia:

cloudflare.com -> caching -> Purge Cache (Saya membersihkan semuanya) Itu menyelesaikan masalah saya!

Asle
sumber
2
Ini membersihkan cache edge Cloudflare. Itu tidak menghapus cache Nginx di server Anda sendiri.
mahemoff
Sebagai saran, saya pikir ini adalah jawaban yang valid.
Fernando Kosh
Ini jawaban yang sangat bagus. Saya menggali beberapa jam mengapa beberapa file masih di-cache dan tidak bisa menebak itu adalah 'kesalahan' CloudFlare. Terima kasih!
undefinedman
6

Kami memiliki cache nginx yang sangat besar (gigabytes) yang kadang-kadang perlu kami hapus. Saya telah membuat skrip yang secara instan menghapus cache (sejauh yang menyangkut Nginx) dan kemudian menghapus direktori cache tanpa membuat kelaparan aplikasi utama untuk disk I / O.

Singkatnya:

  1. Pindahkan folder cache ke lokasi baru (pada sistem file yang sama!) (Ini tidak mengganggu deskriptor file terbuka)
  2. Buat kembali folder cache yang asli, kosongkan
  3. Muat ulang Nginx ( anggun memuat ulang dengan , di mana nginx memungkinkan pekerja lama menyelesaikan permintaan yang sedang berlangsung)
  4. Hapus data cache lama

Berikut skripnya, yang dirancang untuk Ubuntu 16.04 LTS, dengan cache terletak di /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

Dan jika itu membantu, inilah konfigurasi Nginx yang kami gunakan:

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;
    }
}
David Eyk
sumber
5

Bagi mereka yang solusi lain tidak berfungsi, periksa apakah Anda menggunakan layanan DNS seperti CloudFlare . Dalam hal itu aktifkan "Mode Pengembangan" atau gunakan alat "Bersihkan Cache".

Leopoldo Sanczyk
sumber
5

Harap perhatikan bahwa proxy_cache_bypass dapat memberi Anda dunia yang terluka jika aplikasi Anda tidak mengembalikan respons yang dapat di-cache untuk permintaan spesifik tempat Anda memicu itu.

Jika misalnya aplikasi Anda mengirim cookie dengan setiap permintaan pertama, maka skrip yang memicu proxy_pass_bypass melalui curl mungkin akan mendapatkan cookie itu dalam jawabannya, dan nginx tidak akan menggunakan respons itu untuk menyegarkan item yang di-cache.

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

Berhati-hatilah untuk menentukan jalur yang benar dengan benar.

colapsnux
sumber
3

Bagi mereka yang telah mencoba menghapus file cache nginx, dan itu tidak berhasil atau telah bekerja sebentar-sebentar, lihat pengaturan Anda untuk open_file_cache. Jika ini diaktifkan dan dikonfigurasi untuk menyimpan cache deskriptor file untuk waktu yang lama, maka Nginx mungkin masih melihat versi file yang di-cache, bahkan setelah Anda menghapusnya dari disk. Saya harus mengurangi open_file_cache_valid menjadi 1s (Saya tidak yakin apakah ini pada dasarnya sama dengan menonaktifkan cache file sepenuhnya).

SilentMiles
sumber
2

Di server saya, folder cache nginx berada di /data/nginx/cache/

Jadi saya menghapusnya saja: sudo rm -rf /data/nginx/cache/

Semoga ini bisa membantu siapa saja.

Brilliant-Duc
sumber
2

Jika Anda ingin menghapus cache file tertentu maka Anda dapat menggunakan proxy_cache_bypassarahan. Ini adalah bagaimana Anda melakukannya

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

Sekarang jika Anda ingin memotong cache Anda mengakses file dengan melewati parameter nocache

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

Sajjad Ashraf
sumber
1
Saya kira ini bisa digunakan untuk menyerang dan mengkonsumsi bandwidth di situs web Anda.
Marcelo Agimóvel
1
Bukankah ini hanya memotong cache untuk permintaan saat ini ( app.css?nocache=true) sementara file asli (tanpa permintaan) tetap di cache ( app.css)?
adrianTNT
1

Anda dapat menambahkan konfigurasi di nginx.conf seperti berikut ini.

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

    ....
}
...
}

Dari atas, folder bernama "nginx_cache" secara dinamis dibuat di / tmp / untuk menyimpan konten yang di-cache.

austinzmchen
sumber
1

Ada satu metode yang tepat untuk menghapus hanya file cache, yang cocok dengan KUNCI apa pun. Sebagai contoh:

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

Ini menghapus semua file cache, yang cocok dengan KEY "yahoo / *", jika di nginx.conf disetel:

proxy_cache_key $host$uri;
Ivan BlaBlaBla
sumber
1

Kami menggunakan nginx untuk menyimpan banyak hal. Ada puluhan ribu item di direktori cache. Untuk menemukan item dan menghapusnya, kami telah mengembangkan beberapa skrip untuk menyederhanakan proses ini. Anda dapat menemukan repositori untuk skrip ini di bawah:

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

Idenya sederhana. Untuk membuat indeks cache (dengan kunci cache dan file cache yang sesuai) dan cari di dalam file indeks ini. Itu benar-benar membantu kami untuk mempercepat menemukan item (dari menit ke detik) dan menghapusnya.

Zafer
sumber
1

Dalam kasus saya, touchfile Css itu, membuatnya tampak seperti sumber daya berubah (sebenarnya touchtidak melakukan apa pun pada file, kecuali mengubah waktu modifikasi terakhir), jadi browser dan nginx akan menerapkan sumber daya terbaru

Nuh
sumber
0

Saya mengalami sejenis masalah serupa:

Pengaturan dan Masalah Sistem: (Di virtualbox saya hosting web menggunakan ubuntu dan nginx - PHP menyegarkan halaman web tidak mencerminkan perubahan pada file css eksternal). Saya mengembangkan situs web di mesin windows dan mentransfer file ke nginx melalui folder bersama. Tampaknya nginx tidak menerima perubahan pada file css (menyegarkan dengan cara apa pun tidak membantu. Mengubah nama file css adalah satu-satunya hal yang berhasil)

Solusi: Pada VM temukan file bersama (file css dalam kasus saya). Buka dengan nano dan bandingkan dengan file di windows share (mereka tampak identik). Di VM, simpan file bersama dengan nano. Semua perubahan sekarang tercermin di browser. Tidak yakin mengapa ini berhasil tetapi itu terjadi pada saya.

UPDATE: Setelah reboot server VM masalah kembali. Mengikuti instruksi di bawah Solution membuat css responsif terhadap pembaruan lagi

Tuan G
sumber
-1

Dalam kasus saya itu adalah opcache yang diaktifkan di /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Pengaturan ke 0 membuat server memuat versi terbaru (php) file.

Tek Nomad
sumber