nginxのキャッシュをクリアする方法は?


250

私はnginxをフロントサーバーとして使用し、CSSファイルを変更しましたが、nginxはまだ古いファイルを提供しています。

私はnginxを再起動しようとしましたが、成功しませんでした。Googleを使用しましたが、それをクリアする有効な方法が見つかりませんでした。

一部の記事では、キャッシュディレクトリを削除できると説明var/cache/nginxしていますが、私のサーバーにはそのようなディレクトリはありません。

私は今どうすればいい?


1
Nginx構成の詳細は、非常に役立ちます。使っていproxy_cacheますか?
Alexander Azarov

いいえ、デフォルトの構成を使用しただけで、stringについて検索しcacheましたが、構成ファイルで見つかりませんでした
Freewind

5
Nginxはデフォルトではキャッシュしません。
Alexander Azarov

30
virtualbox / vargant vmで実行していますか?その場合、sendfileをオフにしてみてください。一緒に再生できないためです。
kolbyjack

5
キャッシングはnginx側にありますか?curlなどのツールで動作を確認しましたか?多くの場合、このような問題は、クライアント側のキャッシュが更新されたリソースを要求しないことです。これは、expires maxによって古いリソースが長期間有効であると言われているためです。または同様のもの。
kolbyjack

回答:


185

私はまったく同じ問題を抱えていました-Virtualboxでnginxを実行していました。キャッシュをオンにしていませんでした。しかし、sendfileに設定されonたように見えnginx.conf、それが問題の原因でした。@kolbyjackは上記のコメントでそれについて言及しました。

私がオフにしたときsendfile-それはうまくいきました。

それの訳は:

Sendfileは「1つのファイル記述子と別のファイル記述子の間でデータをコピーする」ために使用され、仮想マシン環境で実行するとき、または少なくともVirtualboxを介して実行するときに、明らかにいくつかの実際の問題があります。nginxでこの構成をオフにすると、静的ファイルが別の方法で提供され、変更はすぐに反映され、問題は発生しません

これはこのバグに関連していますhttps : //www.virtualbox.org/ticket/12597



私の場合、代替の回避策は、これらのファイルタイプに対してgzipをオンにすることです。どちらの方法でも問題は解決されます。
ディングル、2014年

答えてくれてありがとう、コルビージャック。私を助けた。
T1000、2015年

1
次の「sudo vim /etc/nginx/nginx.conf」を使用して、「sendfile on」を「sendfile off」に変更しました
KorayGüclüJul

12
sendfileをオフにしました。運が悪い。
marukobotto 2016年

110

を使用して、ファイルごとにバイパス/再キャッシュすることもできます

proxy_cache_bypass $http_secret_header;

おまけとして、このヘッダーを返して、キャッシュ(「ヒット」を返す)から取得したのか、コンテンツサーバー(「バイパス」を返す)から取得したのかを確認できます。

add_header X-Cache-Status $upstream_cache_status;

キャッシュファイルを期限切れ/更新するには、curlまたはその他のクライアントを使用して、キャッシュページにリクエストを送信します。

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

これにより、アイテムの新しいコピーが返され、キャッシュの内容も置き換えられます。


7
なぜこれを一度だけ賛成できるのですか?私はガジリオンをやりたいです:)
Spock

2
これは、新しいページがキャッシュ可能な場合にのみ、キャッシュされたページを更新できます。ページを削除した場合(404またはその他のエラーはバックエンドによって提供されるようになりました)、ページはSet-Cookieまたは「Content-Control:private」ヘッダーを送信するようになり、キャッシュされたコンテンツは「無効」になりません。
rbu 2016

3
この「add_header X-Cache-Status $ upstream_cache_status;」とてもクールな機能です!
Maxim Masiutin 2017

1
どうもありがとう。キャッシュ無効化のヒント、nginxに関するチュートリアルはほとんどありません
Ivan Semochkin

4
あなたが投稿してから、これは変わりましたか?「secret-header」を使用して新しいコピーを正常に取得できますが、ヘッダーを削除するとすぐに、キャッシュされたバージョンを再び取得します...
Pluc

60

proxy_cache_pathを使用してキャッシュゾーンを構成し、それを使用した場合を除き(たとえば、ロケーションブロックで)、次のように使用します: proxy_cache何もキャッシュされません。

ただし、そうした場合、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)
コリン・アンダーソン

繰り返しですか、それとも一度だけですか?実際の問題ではありません。これはおそらく、キャッシュマネージャーが既に削除したファイルを削除しようとしたことを意味します。メッセージが繰り返し表示される場合は、nginxのリロード(nginx -s reload)が役立つことがあります。(それもキャッシュマネージャーを再初期化するかどうかは
わかり

1
ええ、変更をデプロイするときはいつでも、スクリプトによってWebサイトのキャッシュを自動的にクリアします。nginxをリロードしても修正されません。
コリンアンダーソン

Nop Nginxは、プロキシのものを使用していなくても何かをキャッシュしますが、これはNginx + VirtualBoxのバグです。
Thomas Decaux 2013

1
それはかなり漠然と聞こえます。詳しく説明してもらえますか?ここで手元にあるトピックに関連しているようには見えません。
Gnarfoz 2013

20

nginxのキャッシュディレクトリを削除するか、特定のファイルを検索できます。

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

そして、nginxを更新するために1つのファイルのみを削除します。


1
正確なヒットを取得するには、検索用語に$を追加します。いいねgrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang 2014

1
残念ながら、grep: /var/nginx/cache/*: No such file or directoryUbuntu 14.04.3 LTSとnginx / 1.8.1を使用していると、次の出力が得られました。何か案が?
b00r00x0

/ var / nginxの/キャッシュの下でのgrepのファイルに次の試してみてくださいsudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

それは/ var / cache / nginx / *(パス内のnginxの前のdirキャッシュ)だと思います
Randy Lam

15

この質問には2つの答えがあります。

  • リバースキャッシュとしてのnginx用
  • ヘッダー入力によってブラウザーのキャッシュをクリーニングするためのもう1つ(これ)

使用する:

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

私のnginxインストールでは、次の場所に行かなければならないことがわかりました。

/opt/nginx/cache

そして

sudo rm -rf *

そのディレクトリに。nginxインストールへのパスがわかっていて、キャッシュディレクトリが見つかれば、同じように動作する可能性があります。ことは非常に慎重rm -rf、あなたが間違ったディレクトリにある場合、あなたのハードドライブ全体を削除することができ、コマンド。


2
その後、NGINXを再起動する必要があります
Eliel Haouzi

そして、それは悪い部分です
キッズ

9

私は非常に単純なbashスクリプトを実行します。このスクリプトは、仕事を完了するのに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 /キャッシュフォルダが見つかりませんでした
  • sendfileがオフでした

私のドメインはDNSにcloudflare.comを使用しています(すばらしいサービス!)。ああ!ありました:

cloudflare.com->キャッシング->キャッシュのパージ(すべてをパージしました)これで問題が解決しました!


2
これにより、Cloudflareのエッジキャッシュが消去されます。自分のサーバーのNginxキャッシュをクリアしません。
mahemoff 2017年

アドバイスとして、私は正しい答えだと思います。
フェルナンドコシュ

これは素晴らしい答えでした。一部のファイルがまだキャッシュされており、CloudFlareの「障害」であると推測できなかった理由を何時間も調べていました。ありがとう!
undefinedman

6

非常に大きなnginxキャッシュ(ギガバイト)があり、時々ワイプする必要があります。(Nginxに関する限り)キャッシュを即座にクリアし、ディスクI / Oのメインアプリケーションを使い果たすことなくキャッシュディレクトリを削除するスクリプトを作成しました。

要約すれば:

  1. キャッシュフォルダーを新しい場所(同じファイルシステム上)に移動します(これにより、開いているファイル記述子が中断されることはありません)。
  2. 空の元のキャッシュフォルダーを再作成します
  3. Nginxの再読み込み(正常な再読み込み。nginxを使用すると、古いワーカーは進行中のリクエストを完了できます)
  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の設定があります:

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

トリガーした特定のリクエストに対してキャッシュ可能な応答をアプリが返さない場合、proxy_cache_bypassが害を与える可能性があることに注意してください。

たとえば、アプリが最初のリクエストごとにCookieを送信する場合、curlを介してproxy_pass_bypassをトリガーするスクリプトは、おそらくそのCookieを応答で取得し、nginxはその応答を使用してキャッシュされたアイテムを更新しません


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

正しいパスを正しく指定するように注意してください。


3

nginxキャッシュファイルを削除しようとし、それが機能しない、または断続的に機能した場合は、open_file_cacheの設定を確認してください。これが有効になっていて、ファイル記述子を長期間キャッシュするように構成されている場合、ディスクからファイルを削除した後でも、Nginxはキャッシュされたファイルのバージョンを表示することがあります。open_file_cache_validを1秒に減らす必要がありました(これがファイルキャッシュを完全に無効にすることと本質的に同じかどうかはわかりません)。


2

私のサーバーでは、nginxキャッシュフォルダーは /data/nginx/cache/

だから私はそれだけを削除しました: sudo rm -rf /data/nginx/cache/

これが誰にも役立つことを願っています。


2

特定のファイルのキャッシュをクリアしたい場合は、proxy_cache_bypassディレクティブを使用できます。これがあなたのやり方です

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

キャッシュをバイパスする場合は、nocacheパラメータを渡してファイルにアクセスします

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


1
これはあなたのウェブサイトの帯域幅を攻撃し、消費するために使用できると思います。
MarceloAgimóvel19年

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

任意のKEYに一致するキャッシュファイルのみを削除する正しい方法が1つあります。例えば:

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

これにより、nginx.confが設定されている場合、KEY "yahoo / *"に一致するすべてのキャッシュファイルが削除されます。

proxy_cache_key $host$uri;

1

たくさんのものをキャッシュするためにnginxを使用します。キャッシュディレクトリには何万ものアイテムがあります。アイテムを見つけて削除するために、このプロセスを簡略化するスクリプトをいくつか開発しました。このスクリプトのリポジトリは次のとおりです。

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

アイデアは簡単です。キャッシュのインデックスを作成し(キャッシュキーと対応するキャッシュファイルを使用)、このインデックスファイル内を検索します。アイテムの検索を高速化(数分から1秒未満)し、それに応じて削除するのに役立ちました。


1

私の場合、touchそのCssファイルは、リソースが変更されたように見えるようtouchにします(実際には、最終変更時刻の変更を除いて、ファイルには何もしません)。ブラウザとnginxは最新のリソースを適用します


0

私は一種の同様の問題を経験していました:

システムのセットアップと問題: (virtualboxでは、ubuntuとnginxを使用してWebホスティングをしています-PHP Webページの更新で、外部CSSファイルへの変更が反映されませんでした)。私はWindowsマシンでWebサイトを開発しており、共有フォルダー経由でnginxにファイルを転送しています。nginxはcssファイルへの変更をピックアップしないようです(何らかの方法で更新することは助けにはなりません。cssファイル名の変更はうまくいったことだけです)

解決策: VMで共有ファイル(私の場合はcssファイル)を見つけます。nanoで開き、windows共有のファイルと比較します(それらは同一に見えます)。VMで、nanoを使用して共有ファイルを保存します。すべての変更がブラウザに反映されます。これが機能する理由はわかりませんが、私の場合は機能しました。

更新:VMサーバーを再起動した後、問題が再発しました。ソリューションの下の指示に従うと、CSSが更新に再び応答するようになりました


-1

私の場合、それは/etc/php/7.2/fpm/php.ini(Ubuntu)の有効なopcacheでした:

opcache.enable=1

これを0に設定すると、サーバーは(php)ファイルの最新バージョンをロードします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.