« Shell::Perl と pirl を試してみる | メイン | YAPC::Asia 2007でLTしてきました »

Cache-Control: max-ageとSquid

「Cache-Control: max-age=秒数」が、クライアントからのリクエストにあった場合、キャッシュサーバの振る舞いは、『HTTPプロトコル(ソフトバンクパブリッシング・isbn:4797318333)』によると

max-ageディレクティブのもう一つの目的は、クライアント側での使用を前提としたものです。クライアントは、リクエストにmax-ageディレクティブを含めることによって、指定した値より古くなければキャッシュされたオブジェクトを受け入れる用意があることを伝えます。キャッシュサーバが保持しているエントリが、クライアントが要求した経過時間より古い場合には、キャッシュサーバは、たとえオリジンサーバから受け取ったオリジナルのレスポンスの中で該当エントリーが以前有効であるべきと指示されていても、クライアントに対してはキャッシュされたエントリーを返すべきではありません。


となっている。
Squidだと、Cache-Control: max-ageが送られると元コンテンツをサーバに対してIF-Modified-Sinceなリクエストを行う。ここで304 Not Modifiedなどのレスンポンスがあった場合、Squidのログには、TCP_REFRESH_HITなどと残る。

これ自体は正しい動作ですが、某クライアントがmax-age=86400(24時間)を付けてリクエストを送ってくるので、キャッシュサーバを並べているにも関わらず、元コンテンツサーバに負荷がかかっている状態だったので、Squidのソースを力技hack

--- squid-2.6.STABLE11/src/refresh.c.orig       2007-03-20 11:55:35.362223601 +0900
+++ squid-2.6.STABLE11/src/refresh.c    2007-03-20 11:56:00.379705785 +0900
@@ -278,7 +278,7 @@
                if (R->flags.ignore_reload && cc->max_age == 0) {
                } else
 #endif
-               if (age > cc->max_age) {
+               if (age > cc->max_age && cc->max_age > 86400) {
                    debug(22, 3) ("refreshCheck: YES: age > client-max-age\n");
                    return STALE_EXCEEDS_REQUEST_MAX_AGE_VALUE;
                }


このpatchを適用すると、max-ageが86400より大きい場合のみ、コンテンツサーバにリクエストが飛ぶようになる。
これで少し負荷を減らすことができた。


HTTPプロトコル―セキュア&スケーラブルなWeb開発
スティーブン トーマス Stephen Thomas 葛西 重夫
ソフトバンクパブリッシング (2002/03)
売り上げランキング: 390571