レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

nginx でリバースプロキシ、FastCGIキャッシュのキャッシュを削除する方法をまとめて解説してみた

2013年3月1日 2014年2月3日
nginx cache remove

nginx でリバースプロキシのキャッシュを削除する方法は、一応、色々な方法があります。

以前に上記の記事の中でも一部に削除方法について書いています。
今回は、散在している内容をまとめて、ちょっと、掘り下げて簡単に解説してみます。

Nginx リバースプロキシ キャッシュの設定については、以下の記事を参照ください。

Nginx をリバースプロキシ(キャッシュ) として使ってみた

Nginx FCGIキャッシュの設定については、以下の記事を参照ください。

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた

nginx でキャッシュを削除する方法(まとめ)

先のとおりキャッシュを削除する方法は、いろいろあります。それぞれについて簡単に解説してみます。

時間経過による自動削除を待つ

これは、削除するというより、何もしないだけです。例えば、nginxのプロキシ設定(nginx.conf)が以下のような設定となっていた場合、

リバースプロキシ キャッシュ の場合

...
proxy_cache_path      /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...
proxy_cache_valid     200 2h;
...

上記のproxy_cache_pathディレクティブのinactiveパラメータは、指定された時間の間要求がない場合は、キャッシュから削除されます。
そのため、ここでは、1h(1時間)間、だれからもアクセスされなかったら、そのページはキャッシュから削除されます。
また、proxy_cache_validディレクティブは、HTTPステータスコード毎にキャッシュ時間を設定します。
ここでの設定では、HTTPステータスコードが200(正常)の場合は、最大2h(2時間)でキャッシュを解放(削除)します。

上記の設定では、早くて1時間、長くて2時間後には、キャッシュから削除されます。


FastCGI キャッシュ の場合

...
fastcgi_cache_path     /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...
fastcgi_cache_valid    200 2h;
...

基本ディレクティブ名が proxy_cache_path → fastcgi_cache_path のように変化するだけです。
設定するパラメータも同じのため、上記のリバースプロキシ キャッシュ の場合 を参照してください。


キャッシュディレクトリの配下の全ファイルを丸ごと削除する

これは、非常に簡単なやり方で、例えば、nginxのプロキシ設定(nginx.conf)が以下のような設定となっていた場合、

リバースプロキシ キャッシュ の場合

...
proxy_cache_path      /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...

キャッシュゾーン名: cache_example.com は、キャッシュディレクトリとして、/var/cache/nginx/example.com を使用します。
このディレクトリを削除してしまえばよいわけです。

$ rm -fR /var/cache/nginx/example.com

これで一発で削除できるというわけです。
ただ、これは、サイト全体のキャッシュを削除してしまうのには、非常に便利ですが、例えば、1つのページのみが更新された場合などは、 サイト全体のキャッシュを削除する必要はないわけで、毎回、1つ、2つのページの更新のためにサイト全体のキャッシュを削除していては 無駄も多いですし、負荷もかかりやすくなってしまうというデメリットもあります。


FastCGI キャッシュ の場合

...
fastcgi_cache_path     /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...

基本ディレクティブ名が proxy_cache_path → fastcgi_cache_path のように変化するだけです。
設定するパラメータも同じのため、上記のリバースプロキシ キャッシュ の場合 を参照してください。


nginx cache purge モジュールを組み込んでウェブからキャッシュファイルを削除する

Nginxのproxyでキャッシュを削除する方法 にて詳しく解説していますので、そちらを参照してください。

このやり方は、確かにページ毎のキャッシュを削除してくれるという点では、非常にありがたいのですが、nginxも結構頻繁に更新がかかりますから、 その都度、nginx cache purge モジュールを組み込むために自前でビルド(make)作業が必要なのがデメリットです。


キャッシュファイルを検索して、該当するキャッシュファイルを削除する

これは、Unix系(Linuxも含む)OSでは、非常に便利、簡単なやり方です。
先のキャッシュディレクトリの一括削除と同じ以下の例で解説しています。

例えば、nginxのプロキシ設定(nginx.conf)が以下のような設定となっていた場合、

リバースプロキシ キャッシュ の場合

...
proxy_cache_path      /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...
# backend
upstream example.com.backend {
    ip_hash;
    server 127.0.0.1:8080;
}
...
server {
    listen 80;
    server_name example.com;
    ...
    location / {
        proxy_pass      $scheme://example.com.backend;
        proxy_cache_key $scheme://$host$request_uri;
        proxy_cache     cache_example.com;
    }
    ...
}

キャッシュゾーン名: cache_example.com は、キャッシュディレクトリとして、/var/cache/nginx/example.com を使用します。
このディレクトリからキャッシュを削除したいURL情報をもとにキャッシュファイルを検索し、削除してしまいます。

$ find /var/cache/nginx/example.com -type f -exec grep -l "KEY: http://example.com/$" {} \; | xargs rm -f

これは、キャッシュファイルの中にKEY情報が埋め込まれていることを利用して該当するキャッシュファイルをディレクトリから検索をかけて、 キャッシュファイルがあれば削除するということを1行で行っています。

先のキャッシュファイルに埋め込まれるKEY情報は、nginxの設定ファイル(nginx.conf)のproxy_cache_keyディレクティブで設定されている情報が、‘KEY: ‘ を先頭に付加して そのまま設定されます。

FastCGI キャッシュ の場合

...
fastcgi_cache_path      /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
...
# backend
upstream example.com.backend {
    ip_hash;
    server 127.0.0.1:8080;
}
...
server {
    listen 80;
    server_name example.com;
    ...
    location / {
        fastcgi_pass      $scheme://example.com.backend;
        fastcgi_cache_key $scheme://$host$request_uri;
        fastcgi_cache     cache_example.com;
    }
    ...
}

基本ディレクティブ名が proxy_cache_path → fastcgi_cache_path のように変化するだけです。
設定するパラメータも同じのため、上記のリバースプロキシ キャッシュ の場合 を参照してください。


キャッシュファイル名を求めて、該当するキャッシュファイルを削除する

上記と異なり、キャッシュファイルを検索せずにキャッシュファイルをURLから求めることもできます。
以下は、その例です。

$ echo -n "http://example.com/" | md5sum | awk '{print "/var/cache/nginx/example.com/"substr($1,length($1),1)"/"substr($1,length($1)-2,2)"/"$1}' | xargs rm -f

このやり方は、nginxのキャッシュファイルの命名方法を利用したものです。
nginxは、キャッシュファイルの命名方法、格納ディレクトリの指定を以下の手順で行っています。


  1. キャッシュ対象のURLをMD5でハッシュ変換し、ファイル名とする

    シェルであれば、以下のようなイメージです。

    $ echo -n "http://example.com/" | md5sum
    a6bf1757fff057f266b697df9cf176fd  -

    ここで有効な情報は、の手前までです。


  2. nginx.confのproxy_cache_path (or fastcgi_cache_path) で設定しているlevelsパラメータからディレクトリを決定する

    上記のnginx.confの設定例では、levels=1:2 となっています。

    • リバースプロキシ キャッシュ の場合
      ...
      proxy_cache_path      /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
      ...
    • FastCGI キャッシュ の場合
      ...
      fastcgi_cache_path    /var/cache/nginx/example.com levels=1:2 keys_zone=cache_example.com:15m inactive=1h max_size=1000m;
      ...

    この意味は、
    ディレクトリの1階層目は、先のURLをハッシュ値へ変換した末尾から1文字を使用します。
    ディレクトリの2階層目は、先のURLをハッシュ値へ変換した末尾+1から2文字を使用します。

    つまり、上記の http://example.com/ のハッシュ値を例に解説すると、6f , d がそれぞれのディレクトリ階層になります。

    a6bf1757fff057f266b697df9cf176fd

    シェルであれば、以下のようなイメージです。

    $ echo -n "http://example.com/" | md5sum | awk '{print "level1:"substr($1,length($1),1)" level2:"substr($1,length($1)-2,2)}'
    level1:d level2:6f

  3. nginx.confのproxy_cache_path (or fastcgi_cache_path) で設定しているキャッシュディレクトリと上記のキャッシュディレクトリ、キャッシュファイル名を結合する

    最後は、上記で求めたディレクトリ名、ファイル名とnginx.confのproxy_cache_path (or fastcgi_cache_path) で設定しているキャッシュディレクトリとを結合してキャッシュファイルのフルパスとします。

    これは、シェルでは以下のようにできます。

    $ echo -n "http://example.com/" | md5sum | awk '{print "/var/cache/nginx/example.com/"substr($1,length($1),1)"/"substr($1,length($1)-2,2)"/"$1}'
    /var/cache/nginx/example.com/d/6f/a6bf1757fff057f266b697df9cf176fd

    最初に紹介したコマンドイメージの 最後の | xargs rm -f を除いたイメージです。



ついでに削除する phpスクリプトを作ってみた(おまけ)

個々のページ毎のキャッシュファイルを削除する方法をphpコードで書くと、以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php

if($argc>=4){
	//	chek of parameters
	$params = array(
		'-c' => array( 'pattern' => '/-c=([^\s]*)/i', 'required' => true ,'valindex' => 1 ),
		'-l' => array( 'pattern' => '/-l=([^\s]*)/i', 'required' => true ,'valindex' => 1),
		'-u' => array( 'pattern' => '/-u=([^\s]*)/i', 'required' => true ,'valindex' => 1),
		'-d' => array( 'pattern' => '/-d/i' , 'required' => false ,'valindex' => 0),
	);
	for($ni=1;$ni<$argc;$ni++){
		foreach($params as $pkey => $param){
			$output = array();
			if(preg_match ( $param['pattern'], $argv[$ni],$output)){
				$params[$pkey]['val'] = $output[$param['valindex']];
				break;
			}
		}
	}
	foreach($params as $pkey => $param){
		if($param['required'] && empty($param['val'])){
			echo 'error : do not input "'.$pkey.'" paramater.'."\n";
			return;
		}
	}

	//	set of parameters
	$cach_path = $params['-c']['val'];
	$file_key  = md5($params['-u']['val']);
	$level_keys= preg_split("/:/", $params['-l']['val']);
	$debug = !empty($params['-d']['val']);

	if(substr($cach_path,-1,1)==DIRECTORY_SEPARATOR){
		$cach_file = substr($cach_path,0,-1);
	} else {
		$cach_file = $cach_path;
	}
	$offset = 0;
	foreach($level_keys as $level){
		$ilevel = intval($level);
		$offset -= $ilevel;
		$cach_file .=  DIRECTORY_SEPARATOR.substr($file_key,$offset,$ilevel);
	}

	//	create cache file name.
	$success = false;
	$cach_file .=  DIRECTORY_SEPARATOR.$file_key;
	$cach_file_exist =  file_exists($cach_file);
	if($cach_file_exist){
		$file_content = file_get_contents($cach_file);
		$output = array();
		if(preg_match('/KEY\s*:\s*([^\n]*)/i', $file_content,$output)){
			if(strcasecmp($output[1],$params['-u']['val'])==0){
				//	sure file, remove the cache
				if(!$debug) {
					$success = unlink($cach_file);
				} else {
					$success = true;
					
				}
			}
		}
	}
	if($success) {
		echo 'Removed:'.$cach_file."\n";
	} else {
		echo 'Can not removed'.($cach_file_exist ? '(Error):':'(not Found):').$cach_file."\n";
	}

	if($debug) {
		// debug informations.
		echo "parameters:\n";
		foreach($params as $pkey => $param){
			echo '  "'.$pkey.'":'.$param['val']."\n";
		}
		echo "Cach file:".$cach_file."\n";
		echo "Cach file exist ? ".print_r($cach_file_exist,true)."\n";
	}

} else {
	//	show usage
	echo 'Usage : php '.basename(__FILE__).' -c=%cache path% -l=%level% -u=%url% [-d]'."\n";
	echo ' ex.) '."\n";
	echo '   php '.basename(__FILE__).' -c=/var/cache/nginx -l=1:2 -u=http://example.com/sample.html'."\n";
	echo '   "-d" options is debug mode. debug mode will not remove cache file.'."\n";
}

?>

ちょっと長くなりましたが、これってコマンドラインで、キャッシュディレクトリ、URL、LEVELSを指定すると自動的に削除してくれるというもので、 パラメータのチェックや使い方、デバッグ情報の出力のために長くなっていますが、やっていることは、上記のMD5でファイルパスを作って、 一応、念のためにキャッシュファイルの中のKEY情報 と比較して一致したら削除しています。

上記の exmaple.com の例をこのphpスクリプトで実行すると以下のようになります。
ここでは、このphpスクリプトのファイル名を rm_cache.php としています。

$ php rm_cache.php -c=/var/cache/nginx/example.com -l=1:2 -u=http://example.com/
Removed:/var/cache/nginx/example.com/d/6f/a6bf1757fff057f266b697df9cf176fd

いかがだったでしょうか?
最後のキャッシュファイルを検索して、該当するキャッシュファイルを削除する方法では、2つのやり方を簡単に解説してみました。
いずれでも良いとは思いますが、やっぱり、後者が理に適っていると思います。

これをうまく利用すれば、nginx cache purge モジュールを組み込む必要もなくなりますから、CentOS,Scientific Linux,Debian,Ubuntuでは、 nginxから最新版のバイナリで常に更新できるようになります。 もし、nginx cache purge モジュールを組み込んでおられる方には、おすすめな方法だと思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Apache でディスクキャッシュを削除する方法をまとめて解説してみた

Apache でキャッシュを削除する方法は、一応、公式なものは、htcachecleanを使っての削除のみです。 Apacheのキャッ ...

nginx のキャッシュをモバイル(スマホやタブレットなど)に対応する方法

nginx のキャッシュには、大きく2つの方法があります。(下記の記事参照) Nginx をリバースプロキシ(キャッシュ) として ...

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた

ウェブサーバーのキャッシュ機能は、動的なページの高速化にかなり役立ちます。 例えば、Wordpressなどは覿面(てきめん)で ...

Nginx をリバースプロキシ(キャッシュ) として使ってみた

前回「Nginx + php-fpm をさくらのVPSで使ってみた」では、 nginxをウェブサーバーとして使ってみました。実際に ...

ConoHa VPSイメージ

ConoHa VPS の Wordpressテンプレート を使ってみた

ConoHa VPS で、ちょっとだけ話題になっている WordPress テンプレートを使ってみました。 Wordpress ...


2 件 コメントがあります。 コメントを投稿する
  1. nginx愛好家
    2014年1月22日, 5:15 PM

    キャッシュディレクトリの中を削除してもメモリに残ったキャッシュは消えないので、期待通りの効果は得られませんよ。

  2. 管理人
    2014年1月22日, 11:17 PM

    nginx愛好家 さん
    コメントありがとうございます、管理人です。
    おっしゃってるのは、HttpMemcachedModuleを使っている場合の話?それとも??
    ちょっと正確なところがよく理解できていません、すみません。
    どういう時にメモリに残る?のか、理解できていない情けない私に、もう少し具体的にご教示いただけませんでしょうか?
    よろしくお願い申し上げます。

    単純にディスクキャッシュだけを使っている場合、キャッシュファイルを削除すれば、概ね動く?というより、現状、このサイトは、(FCGICacheですが)期待どおりの動作をしています。メモリが厳しい1GBのさくらなので、メモリキャッシュが使える状態でないことも確か?なのですが、 キャッシュされている時は、それなりの動作なので、それなりに満足しています。一応、ご参考までに。


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2869 [s]