web-dev-qa-db-ja.com

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

私はフロントガラスとしてnginxを使います、私はCSSファイルを修正しました、しかしnginxはまだ古いものを提供しています。

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

いくつかの記事では、キャッシュディレクトリvar/cache/nginxを削除するだけでよいと言っていますが、私のサーバーにはそのようなディレクトリはありません。

私は今どうすればいい?

217
Freewind

私はまったく同じ問題を抱えていました - 私はVirtualboxで私のnginxを実行していました。キャッシングがオンになっていませんでした。しかし、nginx.confsendfileonに設定されているため、問題が発生していました。 @ kolbyjackはコメントでそれを上で言及しました。

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

これは以下の理由による:

Sendfileは「あるファイルディスクリプタと別のファイルディスクリプタとの間でデータをコピーする」ために使用され、仮想マシン環境で実行した場合、または少なくともVirtualboxを介して実行した場合、明らかに問題があります。 nginxでこの設定をオフにすると、静的ファイルは別の方法で提供され、変更は即座にそして疑いなく反映されます。

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

175

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

proxy_cache_bypass $http_secret_header;

そしてボーナスとして、あなたがそれをキャッシュ( 'HIT'を返すでしょう)からそれを得たか( 'BYPASS'を返すでしょう)確かめるためにこのヘッダを返すことができます。

add_header X-Cache-Status $upstream_cache_status;

キャッシュされたファイルを期限切れにする、または更新するには、curlまたはその他の休止クライアントを使用して、キャッシュされたページに要求を出します。

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

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

92
Jason Wiener

proxy_cache_path でキャッシュゾーンを設定してから使用した場合を除き(ロケーションブロックなどで)、proxy_cachenothingは使用されません。キャッシュされます。

しかし、そうした場合、 nginxの作者によると 、キャッシュディレクトリからすべてのファイルを削除するだけで十分です。

最も簡単な方法:find /path/to/your/cache -type f -delete

56
Gnarfoz

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

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

そして、nginxがそれらをリフレッシュするために1つのファイルだけを削除します。

20
Łukasz Sokolik

この質問には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;
}
14
deyes

私はこれが役に立った

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

検索し、見つかった場合は削除します。

10
agustik

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

/opt/nginx/cache

そして

Sudo rm -rf *

そのディレクトリに。あなたがあなたのnginxインストールへのパスを知っていて、キャッシュディレクトリを見つけることができるなら、同じことがあなたのために働くかもしれません。 rm -rfコマンドを使用するときは、非常に慎重にしてください。間違ったディレクトリにいる場合は、ハードドライブ全体を削除することができます。

10
Ganesh Shankar

私はとても簡単なbashスクリプトを実行しています。これは仕事をするのに10秒もかかり、完了したら私にメールを送ります。

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

他の解決策がうまくいかない人のために、あなたが CloudFlare のようなDNSサービスを使っているか確認してください。その場合は "Development Mode"を有効にするか "Purge Cache"ツールを使ってください。

5

あなたがそれをトリガーした特定のリクエストに対してあなたのアプリがキャッシュ可能なレスポンスを返さない場合、proxy_cache_bypassはあなたに怪我をさせます。

例えば、あなたのアプリが最初のリクエストのたびにクッキーを送信する場合、curlを介してproxy_pass_bypassをトリガーするスクリプトはおそらくそのクッキーを回答に入れるでしょう、そしてnginxはnotそれを使いますキャッシュされたアイテムを更新するための応答。

5
dwt

私もこの問題を抱えていました。

  • Nginx/cacheフォルダが見つかりませんでした
  • sendfileがオフになっていました

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

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

4
Asle

非常に大きな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;
    }
}
4
David Eyk

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

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

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

3
colapsnux

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

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

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

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

2
Sajjad Ashraf

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

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

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

1
Brilliant-DucN

次のように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 /に動的に作成され、キャッシュされたコンテンツを格納します。

0
austinzmchen

キャッシュファイルだけを削除する正しい方法があります。これはどのキーにも一致します。例えば:

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

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

proxy_cache_key $Host$uri;
0
Ivan BlaBlaBla

私の場合は/etc/php/7.2/fpm/php.ini(Ubuntu)で有効になっているopcacheでした。

opcache.enable=1

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

0
Tech Nomad

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

システムの設定と問題:(仮想ボックスでは、ubuntuとnginxを使用してWebホスティングしています - PHP Webページの更新は変更を反映しませんでした外部cssファイルへ)私は、Windowsマシン上でWebサイトを開発していて、共有フォルダを介してファイルをnginxに転送しています。 nginxがcssファイルへの変更を反映していないようです(何らかの方法で更新しても役に立ちません。cssファイル名を変更してもうまくいっただけです)。

解決策:VM共有ファイル(私の場合はcssファイル)を見つけます。 nanoで開き、windows共有のファイルと比較します(それらはまったく同じように見えます)。 On VM共有ファイルをnanoで保存します。すべての変更がブラウザに反映されました。なぜこれがうまくいくのかわからないが、私の場合はそうであった。

アップデート:VMサーバの再起動後、問題が発生しました。 Solutionの下の指示に従って、CSSが再びアップデートに応答するようにしました

0
Mr G