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より大きい場合のみ、コンテンツサーバにリクエストが飛ぶようになる。
これで少し負荷を減らすことができた。
ソフトバンクパブリッシング (2002/03)
売り上げランキング: 390571