備忘録2連荘です。
備忘録記事が増えているということは、トラブルが頻発しているということです。
そういうことです。死ぬ
目的
Nginxでキャッシュしているコンテンツについて、特定のコンテンツキャッシュだけ削除したい。
例として、
というコンテンツのキャッシュがあった場合、それだけを狙い撃ちして削除したい。
キャッシュクリアの方法
キャッシュファイルの場所
まず、Nginxのキャッシュがどこに保存されているかを確認します。
おそらく、nginxのコンフィグファイルに以下の記載があるはず。
proxy_cache_path [DIRパス] levels=1 key_zone=...
proxy_cache_pathという設定には色々な項目があるのですが、重要なのは書いているDIRパスです。
nginxのキャッシュは上記のDIRパスに保存されていきます。
例えば、DIRパスが
/etc/nginx/cache
だった場合、キャッシュは以下のように保存されていきます。
/etc/nginx/cache/0/f38a744d2856f0b7111150a1a21eded0
キャッシュファイル名はmd5で暗号化されているようです。
キャッシュ削除(すべて)
キャッシュを全て削除したいのであれば簡単です。
上記のDIRパスに格納されているファイル(ディレクトリ)を全て削除すればよいです。
# rm -rf /etc/nginx/cache/*
これでキャッシュ保存されているすべてのコンテンツを削除することができます。
キャッシュ削除(特定のコンテンツのみ)
しかし、今回やりたいのは特定のコンテンツのみキャッシュを削除すること。
よって、まずはその特定のコンテンツがどのキャッシュファイルなのかを探す必要があります。
ちなみに、以上のキャッシュファイルをless等で覗いてみると分かるのですが、バイナリファイルといいつつ、キャッシュの情報等をテキスト形式で保持していることが分かります。
# cat /etc/nginx/cache/0/f38a744d2856f0b7111150a1a21eded0 KEY: http://hogehoge.hoge/index.html HTTP/1.1 200 OK Date: Tue, 02 Jul 2019 11:11:11 GMT <以下略>
重要なのはこのKEYの部分。
ここで特定のコンテンツを探すことができます。
そのコマンドはこちら
# grep [コンテンツ名] -rl [キャッシュ保存DIR]
上記の例だと、
# grep "hogehoge.hoge/index.html" -rl /etc/nginx/cache/ /etc/nginx/cache/0/f38a744d2856f0b1111750a1a21eded0
って感じですね。
これで出力されたキャッシュファイルをrmで削除することで、キャッシュクリアすることができます。
まとめ
- nginxで特定のコンテンツを削除するにはgrep -rlを使え!
xargeとかでつなげてあげるとキャッシュの自動削除化もできそうですね。
まあ、本当はnginxの設定でキャッシュの保持期間等を調整してあげるのが一番良いのですが・・・
コメント