« 2007年02月 | メイン | 2007年04月 »

2007年03月22日

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

2007年03月14日

Shell::Perl と pirl を試してみる

id:naoya氏がブクマしてたのを見て入れてみた。
pirlは、perlshのような対話型のperlシェルです。

Shell::Perlをinstallしようとすると、新しいExtUtils::MakeMakerを要求されるので、cpanコマンドでいれずに、Makefile.PLを書き換えた

-use ExtUtils::MakeMaker 6.31;
+use ExtUtils::MakeMaker;


同時にinstallされるpirlコマンドを実行するとこんな感じ。

 $ pirl                                                                                                                                 [~]
Welcome to the Perl shell. Type ':help' for more information

pirl @> 1+1
2
pirl @> log 10
"2.30258509299405"
pirl @> 


:helpでヘルプがでる。

pirl @> :help
Shell commands:           (begin with ':')
  :exit or :q(uit) - leave the shell
  :set out (D|DD|Y) - setup the output with Data::Dump, Data::Dumper or YAML
  :set ctx (scalar|list|void|s|l|v|$|@|_) - setup the eval context
  :reset - reset the environment
  :h(elp) - get this help screen


outputの形式をYAMLなどにできるのでそれをやってみる。

pirl @> :set out Y
pirl @> {a=>'b',c=>[qw/1 2 3/]}
---
a: b
c:
  - 1
  - 2
  - 3


構造体もdumpして表示できるので、perlshより便利げ。