« Pathtraq サービス中断のお知らせ | メイン | Japanize と Pathtraq が Firefox 3 Beta 1 に対応しました »

2007年11月18日

サーバメンテナンス中にエラー画面を返す方法

 サービスのメンテナンス中など、ウェブサーバ全体で 503500 エラーを返したいようなケースがあると思うのですが、その場合どうすればいいのでしょう。ちょっとググってみたけど分からなかったので自分で考えてみました。

ErrorDocument 503500 "Sorry.  The service is under maintenance."
RedirectMatch 503500 .*

 とりあえずこんな感じでいいみたい。RedirectMatch 等の設定ディレクティブで 300 番台以外のステータスコードを指定できることを今回初めて知りました。 (参考: mod_alias - Apache HTTP Server)

 ですが、この方法だと、メッセージを設定ファイルに記述することはできても、HTML ファイルを表示することができません。より良い方法をご存知の方は教えていただければ幸いです (ウェブサービスなので 302 等ではなく 503500 エラーを返したい)。

0:27追記: 言うまでもなく 500 Internal Server Error ではなく 503 Service Unavailable を返すべきなので修正しました

11月18日追記: /error/ 以下にエラー専用ファイルを置いて、かつ、/error/ ディレクトリ以下に直接アクセスされた場合は 200 OK を返しても良いのであれば (妥当な仮定だと思う)、以下の設定でよさそうです。PCRE は楽だなぁ。

ErrorDocument 503 /error/maintenance.html
RedirectMatch 503 "^/(?!error/)"

投稿者 kazuho : 2007年11月18日 00:11 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1650

コメント

ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var

とかではだめですか?

投稿者 sekimura : 2007年11月18日 04:47

sekimura さん、ありがとうございます。

> ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
> とかではだめですか?

そのエラーページを表示しようとして、また 503 エラーが発生するので、埋め込まれたエラー画面が表示されてしまうようです。

「Additionally, a 503 Service Temporarily Unavailable error was encountered while trying to use an ErrorDocument to handle the request.」

投稿者 kazuho : 2007年11月18日 10:51

RedirectMatchじゃなくてAliasMatchにして、
mod_asisでヘッダをhtmlで指定してみた。
1回だけ試したけど、ちゃんとサイト全体で
ステータス503をhtmlページで返してると思う。

service_unavailable.conf
--
LoadModule asis_module modules/mod_asis.so
AddHandler send-as-is asis
AliasMatch .* 503.html.asisのファイルパス
--

503.html.asis
--
Status: 503 Service Unavailable
Content-type: text/html

html本体
--

投稿者 kazutanaka : 2007年11月19日 14:06

kazutanaka さん、ありがとうございます。これは美しい対処法ですね。

私は mod_asis の存在自体を忘れていました (苦笑)

投稿者 kazuho : 2007年11月19日 14:57

mod_asisは忘れやすいので(笑)、
mod_rewriteだけで可能かやってみました。

これなら普通のhtmlのままで
エラーページにできます。

--
RewriteCond %{REQUEST_URI} !^/503.html$
RewriteRule ^.* "" [R=503,L]
ErrorDocument 503 /503.html
--

asisだと全ページをステータス503にできるんだけど、
これは/503.htmlだけはステータス200になりますね(苦笑)。

でも、自分で使うのであれば、こっちの方かも。

投稿者 kazutanaka : 2007年11月19日 15:47

このエントリとても参考になりました!
今までは無理やり503になる状況を作り出す設定を考えていたのですが、
(Proxyのバックエンド設定をすべてstopにするなど)
新しいやり方を知ることができました。

ありがとうございました

投稿者 myfinder : 2008年12月04日 17:44