あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

Pound のエラーページのカスタマイズ

僕の所属している会社では、リバースプロキシに Poundを利用していて、こいつの 503 エラーを見かけるとよくこう表示されている。

The service is not available. Please try again later.

で、昔からお客さんによく「おいこれどうにかしろ」と言われていたのだけど、ものぐさなのとよくわからなかったのが合わさって、「カスタマイズできないんです!><」と答えていた(上長がだけど)。実際カスタマイズするならソースコード内にハードコーディングかなー、と思ってたのだけど、今日突発的にコード読んで自前の環境で動かしてたら、以下の記述でいけるっぽい事に気付いた。

User           "pound"
Group          "pound"
LogLevel       1

ListenHTTP
  Address 0.0.0.0
  Port 80
  Err503 "/usr/local/etc/503.html"

  Service
    BackEnd
      Address 127.0.0.1
      Port 8000
      TimeOut 30
    End
  End
End

ListenHTTP の中で定義した「Err503」ってとこが目的の部分です。BackEnd で定義した Address に対して、HTTPのステータスコードを判断して、エラーハンドリングして出力する際には、以下の4パターンに分類しているっぽい。

  1. Err414 (HTTP 414)
  2. Err500 (HTTP 500)
  3. Err501 (HTTP 501)
  4. Err503 (HTTP 503)

振る舞いは Apache なんかと一緒で、静的なローカルのファイルを指定します。HTML 形式のドキュメントしか試してませんが、もしかしたら php とか使えるのかもね。まあ背後で動いてる HTTP サーバにエラーページの処理飛ばしているわけじゃないし、Pound に付属してる HTTP.c が解釈してんじゃねっかな。
これ以外、例えば HTTP404 なんかは、バックエンドの HTTP サーバの処理に従ってます。で、各ステータスの説明については、「man pound」でマニュアル呼び出して、「Err」で検索してください。もしうはソースコード内の pound.8 を見てもいいですね。

追記:2012/08/02

err414 500 501 503 で指定できるページだけど、これらは日本語を表示させたい場合、UTF-8 を解釈できない模様なので、shift-jis を使う必要があります。こんな感じで作ってね。

[root@localhost pound]# vi err503.html
<html>
  <head>
    <title> HTTP status : 503 Not Implemented </title>
    <meta http-equiv="Content-Type" content="text/html; charset=shift-jis">
  </head>

  <body>
  <h1>HTTP status : 503 Not Implemented</h1>
  <p>
  エラーだよ〜ん
  </p>
</html>
保存するときは、vim なら「:w」の前に「:set fileencoding=shift_jis」を実行してね。