BIG-IPをSorry Serverとして利用する方法を紹介します。

このiRuleにより、BIG-IPのあるディレクトリからコンテンツを読み込み、ウェブサーバとしてクライアントへ送信します。

通常iRuleでは、BIG-IPのHDDからファイルを利用することが不可能ですが、このiRuleでclassを使って同じような動作を実現する方法を説明します。

機能:
*このiRuleが設定されたVSは、特定のURIを受信した際BIG-IPのファイルシステムに存在するファイルからコンテンツを読み込み、
クライアントへ送信する。
*Sorry Pageやその他のエラーに対してiRuleからコンテンツを送信する。
*Poolの全メンバーがダウンとなった場合、RedirectでiRuleのSorry Pageへ誘導する。
*全メンバーがダウンでない場合でも、Sorry PageのURLの直接入力などによってアクセス可能としている

使い方:
*iRuleが利用するHTMLファイルをmaint.index.html.classとして/var/classのディレクトリに保存。
LFはファイル内で利用不可。また、ダブルクォテーション(")の文字は円マーク(\)でエスケースする必要がある。
*画像ファイルはbase64エンコードで同ディレクトリに保存。
例として、下記のリンクで変換することができます:
http://www.motobit.com/util/base64-decoder-encoder.asp
*base64エンコードされた画像ファイルからLFを取り除く(例えば、viで編集し、「:%s/\n//g」のコマンドで可能)。
*ファイルの内容を変えたら、b loadで再度読み込む必要がある。
*以下Classの定義は、CLIでbigip.confを編集して直接入力する。

※このiRuleは、v10.x以降でご利用いただけます。

【Class定義(bigip.confにコピー・ペースト)】
class maint_index_html {
   type string
   filename "/var/class/maint.index.html.class"
   separator ":="
   }
class maint_logo_png {
   type string
   filename "/var/class/maint.logo.png.class"
   separator ":="
   }


 

【iRule定義】
when RULE_INIT {
    log local0. "Init"
    log local0. "init2"
    set static::maint_prefix "/maintenancepage"
    set static::maint_len [string length $static::maint_prefix]
}

when HTTP_REQUEST {
    log local0. "Request start [HTTP::uri]"
    log local0. "Request continue"
    set uri [HTTP::uri]
    log local0. "URI [HTTP::uri]"
    log local0. "main_prefix = $static::maint_prefix"
    if { $uri equals $static::maint_prefix } {
       HTTP::respond 301 "Location $static::maint_prefix"
       return
    }
    if { $uri starts_with $static::maint_prefix } {
       set uri [string range $uri $static::maint_len end]
       log local0. "here"
       switch $uri {
         "/"              -
         "/index.html"   { HTTP::respond 200 content [class match -value 1 equals maint_index_html] "Content-Type" "text/html" }
         "/logo.png"     { HTTP::respond 200 content [b64decode [class match -value 1 equals maint_logo_png]] "Content-Type" "image/png" }
         default         { HTTP::respond 404 }
       }
       return
    }
    if { [active_members http_pool] < 1 } {
      HTTP::redirect "$static::maint_prefix/index.html"
      return
    }
  }


 

【サンプルのmaint.index.html.classとmaint.logo.png.class】
maint.index.html.class:

"1" := "<html><head><title>Maintenance page</title></head><body><img src=\\\"logo.png\\\"><p><h2>Sorry! This site is down for maintenance.</h2></body></html>",

maint.logo.png.class

"1" := "iVBORw0KGgoAAAANSUhEUgAAAL4AAAC3AgMAAADRFQzGAAAACVBMVEUAAADDAAD///8UoaPIAAAD
hElEQVRo3u3ZOW7dMBAAUB8lSBXkPmTB3g1PEqSf3jAwgYenTP4icVYuXpDmq/Dyv564SSNy+NT2
jpenB3iALYAp7wBI12MZpOOoayClgXAAMJAWAPLzbdMtSPIoM4AKpBnQ5+siNDAF6CI0sOerIhRw
ClAdpUDyjhoDckGOAbggxcA/XzRbAApAjkBQI1EnAaLzeT9xQCHIPkB2QYrqxAHwy0FQJw5E8Rh0
LAMkSw8awQDKa4HfCAZAXgpvVdeNYED3+HFdFAV3QPomgLMiyL7oAPWtj6zm/c8O4Ggb3S9HvDyw
4Kwp3H/7AfwEdNboKGkFiMaDiXoC4FEjOro3jQEcNcL7vUALgN91FVV8qQqco3YHGRQoEtA5/BhE
MAdUDUTlswS4C842R4CSAebZzBJUAdI7QJmAwgF54N8HaQSqB1K/YzIHOALX72IAbKBZwHy+9/Id
9GGIQPoKoANsZSB9CSgdkAeyDsgfBXkKcgfogaJfqwtANjsAZxQp5k00AdXp5wOAnaCyIAMeaAPQ
FoGdU9RVcFSqgzQBNAcgew1mgEyQmQDQ43KOvQPQmxCjBX/UMJVm6sSBvfmKnZSfgDxQ7UJnC+Au
oClw1kYSlAmAXYATkB2QtwDtltAmoHwcwCeD6qz6/zOwsz3avDWmwLnB5SNqgRptmjzTwQRoDKRY
AUIsAX6LiFAZAv5eWQPZAzAAvYhVkHdBX2y2RVAswCHIuyBtg1s/UV4GxQAag/xOUJZBMqB9BnjW
3YRVTqUVyLgJCs1A0pFPDwToBYeOfHtATotLXyqyRZMARcxxF0A1gIpe+Akg81NzkGX+p5y9yhev
A1BHAE8gAz+YBbiY8smlQG3nsnQNOCt2UmvRKrqpdxJPUxjQ+BOHE1A4uPwD1zj5k2dObG6Nz0iv
X/9+5ckcC5BnFi8ffPsRZtYzX2hcCrt88Pb6ywHEIgur0eXH24tXQmOBAnuNalgCG7n+LoNbH353
AU/gHU/i/QK8l3Q7qrejwseh0QC4qcfG3uEqP4Z+chP6WZT0ui/Otza9gheB18voXs4k/kYPU8DN
fVfRIMkcJtajNPZ2ojxOxZfdZH+Qu3d3UIbbCdsbFlGdaghwd9OlTWu0snGURhtHtLs1NZheBYAm
W1n2mYbdDTza3SLUHbWwzRlvrS1spJalnVcanB9Evvj8aLuZ3BX1Y1P+AUbgLzbWCp20NpfmAAAA
AElFTkSuQmCC",

 

※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、お客様の使用環境における動作を保証するものではありません。実際の使用にあたっては、必ず事前にテストを実施することを推奨します。