ソーメニーアクセスとのファイト

会社宛メールを再掲

      • -

ハイエブリワン

トゥデイ、サーバーがソーメニーアクセスでクライング。


・・わかりにくいので日本語で行きます。


ルーのやつは、単純なCGIなので、ちょっと心配していたのですが
やはりサーバーが重くなってきました。

mod_perl化なども考えたのですが、なんかもっと簡単に対処したくて、
順に、やった対策を紹介します。

1) use URI::Fetch & Cache::File

処理の中でページを取りに行く部分が一番重い。
そこで、外のURLを取りに行くときに、

my $res = URI::Fetch->fetch("http://www.google.com/")
   or die URI::Fetch->errstr;
my $html = $res->content;

というようにしていたのを、

my $cache = new Cache::File(
    cache_root      => '/tmp/cache',
    default_expires => '10800 sec',
);
my $res = URI::Fetch->fetch("http://www.google.com/", Cache => $cache)
   or die URI::Fetch->errstr;
my $html = $res->content;

というように URI::Fetch を使うように変更。
このモジュールは sixapart 創業者のBenが作ったもので、
キャッシュを使ったり、ちゃんとexpiresなどを考慮してくれる。
http://search.cpan.org/perldoc?URI::Fetch


2) mod_cache & mod_disk_cache

しかしやはり変換部分は毎回動くので重い。
あと Cache::File がたまにエラる。

そこで apache2 の機能、 mod_cache & mod_disk_cache を利用。

http://httpd.apache.org/docs/2.2/ja/mod/mod_cache.html

mod_cache & mod_mem_cache という選択肢もあるのだが、
メモリは少ないのでディスクキャッシュを利用。

httpd.confへ、普通に

LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so

CacheRoot /tmp/mod_cache
CacheEnable disk /labs/lou_trans/

と書けばよいのかと思ったら、ぜんぜん効かない。

LogLevel debug

とすると、「キャッシュしました」、「キャッシュから出力しました」、などが
出るので見てみるが、QueryString(?url=) が付いてるけどExpiresが
ないからキャッシュしません、などと出てくる。

http://httpd.apache.org/docs/2.2/caching.html
http://blog.digital-sphere.net/index.php?itemid=6

どうやらキャッシュが動くにはいろいろと条件がある。

クエリ文字列が付く場合は、Expires ヘッダをつければよいらしい
そこでCGI出力でExpiresを指定してみる

print $q->header(-charset => $charset');
↓
print $q->header(-charset => $charset, -expires => '+5h');

が、キャッシュされない。

いろいろ調べてたら、キャッシュされるケースも出てきた。
どうやらこういうことらしい。

× /lou_trans/?url=http://...
○ /lou_trans/index.cgi?url=http://...

ファイル名が必要らしい。
そこで、内部的にはファイル名をつけるよう mod_rewire する。

RewriteRule ^/labs/lou_trans/$ /labs/lou_trans/index.cgi [PT,L]

これで、キャッシュが効くようになり、超速くなった。
expiresの値を1分に変更してみてテストしたけど、

print $q->header(-charset => $charset, -expires => '+1m');

ちゃんと期限が切れたらCGIが動く。いい感じです。

LogLevel warn

に戻して完成。

オーダーの多いクッキング店」みたいな
長いページもキャッシュを使ってるとすぐ出てくる。

http://e8y.net/labs/lou_trans/?url=http://www.aozora.gr.jp/cards/000081/files/43754_17659.html

以上


追記

Firefoxの場合、更新ボタンを押したときにキャッシュから読まれない。(IEはOK)

どうやら、Firefoxの場合、更新ボタンを押すと

Cache-Control: max-age=0

が付いている。前述の mod_cache が効く条件によると、これは効かない。

そこで

CacheIgnoreCacheControl On

とした。これでOK