Squid でキャッシュを削除する方法をまとめて解説してみた
Squidをリバースプロキシとして使ってみた では、Squidによるリバースプロキシの設定について書きました。
そこでは、キャッシュされたファイルの削除については触れませんでした。
今回は、Squid でキャッシュを削除する方法について、簡単に解説してみたいと思います。
Squid のキャッシュ制御は、Apacheの htcacheclean (詳細は、Apache でディスクキャッシュを削除する方法をまとめて解説してみた を参照)と同じような動作をします。
nginxと動作とは異なり、Apacheのそれと同じように、有効期限を過ぎてもキャッシュファイルは削除されません。
キャッシュされたURLがアクセスされてキャッシュファイルの更新が実行されます。(古いキャッシュファイルは削除され、新しいキャッシュファイルが作成されます。)
また、これもApache同様、上記のようなキャッシュの更新以外にも、シェルからrm コマンドで キャッシュファイル、あるいはキャッシュディレクトリを直接削除することはできます。
そこで、今回は、Squid で作成されたキャッシュファイルの削除方法にについてまとめてみます。
Squid でキャッシュを削除する方法(まとめ)
先のとおりキャッシュを削除する方法は、いろいろあります。それぞれについて簡単に解説してみます。
時間経過による無効を待つ
これは、削除ではなく、時間の経過によってキャッシュが無効になるだけで、使われないだけです。例えば、Squid のキャッシュ設定(squid.conf)が以下のような設定となっていた場合、
...
# Squid のキャッシュ設定
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
...
|
refresh_patternは、キャッシュの更新を定義するものです。
( 形式 : refresh_pattern [-i] regex min percent max [options]
)
上記の設定の意味は、
拡張子が、.html .htm .css .js
( -i
が付いているので大文字小文字を区別しません ) の場合、
最小キャッシュ時間が、1,440分=24時間=1日
最大キャッシュ時間が、40,320分=672時間=28日=約1か月
となります。
Squidは、要求されたURLのキャッシュ経過時間が、それぞれ以下のような条件で、それぞれの動作をします。
- 最小キャッシュ時間 未満 :
常にキャッシュをそのまま出力します。
- 最大キャッシュ時間 以上 :
最新へキャッシュを更新し、最新ページが出力されます。
- 最小キャッシュ時間 ~ 最大キャッシュ時間 :
キャッシュの鮮度を以下の式から計算します。
キャッシュ鮮度 = キャッシュサーバ上でのキャッシュ保存時間 ÷ ページ(あるいはファイル)の作成または変更からの経過時間
キャッシュ鮮度が 40% を超えない場合は、キャッシュをそのまま出力します。
キャッシュ鮮度が 40% を超えた場合は、最新へキャッシュを更新し、最新ページが出力されます。
例えば、http://www.example.com/sample.html
を考えてみます。
sample.html
は、ウェブサーバーへ 2013-4-1 1:0:0 に作成(最終更新)されたとします。
その後、sample.html
は、Squidにて 2013-4-2 5:0:0(作成されて 28時間=1,680分後) にキャッシュされたとします。
次に、http://www.example.com/sample.html
へアクセスがあったのが、2013-4-3 10:0:0(キャッシュされて 29時間=1,740分後) だったとします。
その場合、キャッシュ鮮度は、以下のようになります。
キャッシュ鮮度 = 1,740分 ÷ (1,680 + 1,740 = 5,160分) = 0.337… = 約34%
この場合、40% を超えない場合は、キャッシュをそのまま出力します。
あくまでの明示的な
Expires(有効期限)情報がない場合の制御になります。
ヘッダ情報に
Expires Sat, 20 Apr 2013 01:35:12 GMT
|
とあれば、GMT時間で、2013-4-20 01:35:12 が有効期限になりますから、その時間を超えた場合は、キャッシュは更新されます。
それが、上記の
最小キャッシュ時間を下回ったとしても、そちらが優先されます。
また、phpなどのスクリプトによる動的なページは、最終更新日がキャッシュされた日時となるでしょう。その場合、キャッシュ鮮度は、常に、100% になります。
上記の設定では、少なくとも 早くて1日、長くて約1か月後には、キャッシュが無効、あるいは更新されます。
(ヘッダ情報に明示的なExpires(有効期限)情報がある場合は、それに従います。)
キャッシュディレクトリの配下の全ファイルを丸ごと削除する
これは、非常に簡単なやり方で、例えば、Squidのキャッシュ設定(squid.conf)が以下のような設定となっていた場合、
...
cache_dir ufs /var/cache/squid 600 16 16
...
|
キャッシュディレクトリとして、/var/cache/squid を使用します。
このディレクトリを削除してしまえばよいわけです。
但し、Squidの場合、このディレクトリに swap.state という状態管理ファイルも同時に保存しています。
安全に削除するには、Squidを停止した上で、削除します。
$ /etc/init.d/squid stop
squid を停止中: ................ [ OK ]
$ rm -fR /var/cache/squid/*
$ /etc/init.d/squid start
squid を起動中: . [ OK ]
|
これでキャッシュの完全なリフレッシュを行うことができます。
ただ、これは、サイト全体のキャッシュを削除してしまうのには、非常に便利ですが、例えば、1つのページのみが更新された場合などは、
サイト全体のキャッシュを削除する必要はないわけで、毎回、1つ、2つのページの更新のためにサイト全体のキャッシュを削除していては
無駄も多いですし、負荷もかかりやすくなってしまうというデメリットもあります。
squidclient で削除する
squidclient は、Squidの公式コマンドで、Squidの状態などを出力、管理することができます。その機能の中で、キャッシュの削除機能があります。
squidclientでキャッシュファイルを削除する場合は、以下のように使用します。
$ squidclient -p 80 -m PURGE -h 192.168.1.100 http://www.example.com/
HTTP/1.0 200 OK
Server: squid/3.1.10
Mime-Version: 1.0
Date: Fri, 19 Apr 2013 20:58:17 GMT
Content-Length: 0
X-Cache: MISS from web.example.com
X-Cache-Lookup: NONE from web.example.com:80
Via: 1.0 web.example.com (squid/3.1.10)
Connection: close
|
該当するキャッシュファイルが存在し、削除できたら、
HTTP/1.0 200 OK
が出力されます。
もし、該当ファイルが存在しない場合は、
HTTP/1.0 404 Not Found
が出力されます。
squidclientでオプションの
-m PURGEを使用するには、Squidの設定が必要になります。
Squidの設定ファイル(/etc/squid/
squid.conf)で以下のように設定します。
...
# キャッシュ削除メソッドを定義します。
acl PURGE method PURGE
# アクセス元ローカルホストを定義します。
acl localhost src 127.0.0.1/32 ::1
acl localnet src 192.168.0.0/16
# キャッシュ削除メソッドへのアクセスは、localhostのみ可とします。
http_access allow PURGE localhost
http_access allow PURGE localnet
http_access deny PURGE
...
|
上記のように設定しておくと、他のホストからの要求は一切拒否されるのでより安全です。
設定を終えたら、Squidの再読み込みを行って利用可能となります。
$ /etc/init.d/squid reload
|
squidclientを使って、ウェブページから削除する(おまけ)
毎回、コマンドをたたくのは大変なので、phpで作成したウェブページからsquidclientを起動して削除してみます。
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
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PURGE Cache for Squid.</title>
<style type="text/css">
table.panel {
border: solid 1px #ccc; border-collapse: collapse;
background-color:transparent;
}
table.panel th {
background:#eee;
border: solid 1px #ccc;
}
table.panel td {
border: solid 1px #ccc;
padding:5px;
}
div.output {
margin:5px 0 5px 0;
padding:5px;
background-color:#ccc;
}
</style>
</head>
<body>
<h1>PURGE Cache for Squid.</h1>
<form action="" method="post">
<table class="panel">
<tr>
<th>項目</th>
<th>値</th>
</tr>
<?php
$squild_client = '/usr/bin/squidclient';
$server_ip = '192.168.1.100';
$server_port = '80';
$url = '';
$show_items = array (
'squild_client' => array( 'squidclient の パス' , '' ,true),
'server_ip' => array( 'サーバーIPアドレス' , '' ,true),
'server_port' => array( 'サーバーポート番号' , '' ,true),
'url' => array( '削除するURL' , '' ,true),
);
$all = 0;
foreach($show_items as $item_key => $item) {
if(isset($_REQUEST[$item_key]) && !empty($_REQUEST[$item_key])){
$show_items[$item_key][1] = $_REQUEST[$item_key];
$$item_key = $_REQUEST[$item_key];
$all++;
} else {
$show_items[$item_key][1] = $$item_key;
}
}
foreach($show_items as $item_key => $item) {
echo '<tr>'
.'<th>'.$item[0].'</th>'
.'<td>'.($item[2]? '<input type="text" name="'.$item_key.'" value="'.$item[1].'" />':$item[1]).'</td>'
.'</tr>'."\n";
}
?>
</table>
<?php
if($all==count($show_items)){
echo '<div class="output">結果<pre>';
$cmd = $squild_client.' -p '.$server_port.' -m PURGE -h '.$server_ip.' '.$url ;
echo '$ '.$cmd."\n";
system($cmd );
echo '</pre></div>';
}
?>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>
|
36-38行目あたりのデフォルト値は、各環境で編集すると使いやすくなると思います。
また、このphpファイルをキャッシュされないようにSquidの設定、ウェブサーバーの設定が必要となるかもしれません。
例えば、Squidの設定( /etc/squid/squid.conf )では、先のphpファイル名を purge.php とすれば、以下のように設定すると良いでしょう。
...
# (必要に応じて)キャッシュ不可の条件を定義します。
# 拡張子 .php をキャッシュ不可に定義します。
acl no_cache urlpath_regex .*\.php$
# 拡張子 .php + パラメータをキャッシュ不可に定義します。
acl no_cache urlpath_regex .*\.php\?.*
# no_cache で定義されたものは、すべてキャッシュしないようにします。
cache deny no_cache
...
|
キャッシュされずに正しく動作したら、以下のように出力され、キャッシュが削除されます。
いかがだったでしょうか?
Squidのキャッシュ 削除は、squidclientで簡単にできて楽ですね。
Squid + Apacheの組み合わせが多いのも このようにキャッシュ制御が整っている点もあるのでしょうね。
Nginx との比較もいろんなサイトで行われていますので、Squidを導入する際は、色々と確認してから導入されると良いと思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :