reverse proxyしつつErrorDocumentする際の罠

で見事にハマったのでメモ.

たとえば以下のようにreverse proxyしている場合に、バックエンドプロセス群が落ちた際のエラー画面を自作したいと思ったとする。

<Location />
  ProxyPass balancer://pbcluster/
  ProxyPassReverse balancer://pbcluster/
</Location>

そんな時はとりあえず、ここに

ErrorDocument 503 /maintenance.html

と置くでしょう。

そうすると、いつも通りのApache組み込みエラー画面が表示されて下記のメッセージも付与されてしまう。

a 503 Service Temporarily Unavailable error was encountered while trying to use an ErrorDocument to handle the request

で、おそらく/maintenance.htmlを表示しようとするもののに引っかかってしまうのでApacheさんが気を効かせてくれたのだな、とポジティブに考えてみた。


これを回避しようと思い, LocationMatchで/maintenance.htmlを除外(否定の先読み)しようかと試したのですが期待通りに動いてくれない(Perlだと上手くいくんだけどなぁ)。


結局、ProxyPassの除外ディレクティブを使って解決しましたとさ。どっとわらい。

ErrorDocument 503 /maintenance.html
ProxyPass /maintenance.html !
<Location />
  ProxyPass balancer://pbcluster/
  ProxyPassReverse balancer://pbcluster/
</Location>