Passenger+Apache, アプリケーション起動時に例外が発生した時のエラーページが変更できないしErrorDocumentの設定は無視される

環境

  • Phusion Passenger 2.2.5

目的

一般ユーザにスタックトレースを見せたくない。production環境においてはアプリケーション起動時のエラーについても簡素なエラーページを表示させたい。

概要

Passenger上で動くアプリケーションインスタンス初期化時(Rackアプリだったらconfig.ru実行時)に例外が発生すると、Passengerが組み込みエラーページ(スタックトレースを含む)を返すようになっている。Passengerには組み込みエラーページを制御するオプションがなく(エラー表示の該当箇所は spawn_manager.rbのSpawnManager#handle_spawn_application で、エラー表示メソッド send_error_page が使っている htmtemplate.rbのHTMLTemplate にエラーテンプレートの位置がハードコーディングされていて変更不能)、またErrorDocumentの指定は無視される。

ApacheのErrorDocumentは「ステータスコードを見てレスポンスを上書きする」ようなものではなく、単にApache本体のエラーハンドリングに影響するだけらしい。標準ではステータスコードに応じてレスポンスを変更するようなモジュールは存在しないようだ。

ソリューション

不確実な方法

アプリケーション初期化時にエラーを起こさない。
失敗する可能性のある処理(DB接続など)を初期化時に行わないことでエラー発生率を下げる、config.ruで初期化時の例外をキャッチしてどうにかする(どうすんだ)等。

確実だけど筋が悪い方法

エラーページのテンプレート(Passengerライブラリのlib/phusion_passenger/templates/*.erb)を置き換える。
アプリケーションごと/環境ごとに異なったエラーページ出すとか、それだけじゃ無理(productionでのみスタックトレース出さないとか)。あと保守が面倒。

結論

どうすればいいんでしょうか