mod_rewriteでサーバーの負荷が高いときだけリダイレクトする

  • 投稿日:
  • by
  • カテゴリ:

ワタシが働いている会社のホームページは、たまーにYahooのトピックスからリンクされます。
トピックスに載るとそれはもう大量のアクセスが津波のように押し寄せてきて、あっというまにサーバーのリソースを食いつぶしてアクセス不能になってしまいます。

こういうときのために、Contents Delivery Networkによるキャッシングも利用してます。
今までは、リンクされそうになったらmod_rewriteでリダイレクトって方法を使っていました。
でも毎回これをやるのが面倒になってきたので、なんとかならんかなーと思って、RewriteMapに初挑戦してみた。

RewriteMap使えばRewriteCondとかRewriteRuleにプログラムの出力結果を使うことが出来るようになるので、これでWebサーバーのロードアベレージを見て高いときだけリダイレクトってのが出来そうである。

いそいろ調べて試行錯誤した結果、こんな感じにやったら、ロードアベレージが高いときだけリダイレクトしてくれるようになった(っぽい)。
やった!これでYahoo!なんて怖くない!
しばらくこれで運用してみよう。

httpd.conf

RewriteMap ldavg prg:/path/to/loadaverage.pl
RewriteCond %{HTTP_HOST} !^hoge\.sample\.com$
RewriteCond %{HTTP_REFERER} dailynews\.yahoo\.co\.jp
RewriteCond ${ldavg:} >5.00
RewriteRule ^/news/(.*)/$ http://hoge.sample.com/news/$1/ [R,L]

loadaverage.pl

#!/usr/bin/perl

use strict;
$| = 1;

while (<STDIN>) {
    my ($ldavg1, $ldavg2, $ldavg3) = `uptime` =~ /load average:\s+([.0-9]+),\s+([.0-9]+),\s+([.0-9]+)/;
    print $ldavg1 + 0 . "\n";
}

まだYahooからリンクされていないので、本当に思い通り動くのかはわからない…。