ApacheとTomcat連携時に、ErrorDocumentを有効化する方法。
関連ページ
参考URL
ApacheとTomcatを連携させてサイトを運営していると、サイトに更新をかける際に必ずTomcatをRestartさせる瞬間がある。
この際Tomcatが一時的に停止状態になるので、このわずかな時間内にサイトにアクセスした人はApacheから下のような503エラー文を見ることになる。
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
---------------------------------------------------------------------------------------------------------------------------------
Apache/x.x.xx (Ubuntu) Server at unity-engineer.top Port 443
こういうのを見ると一般の人はもう運営していないサイトと勘違いする可能性もあるので、日本語の「メンテナンス中です」みたいなページに置き換えたい。
しかしErrorDocumentをconfに書き込んでも全く反映されなかった。
これの解決方法が分かったのでそのメモ。
ErrorDocumentが正常に機能しない
Apacheでサイトを運営しているなら、confファイルにErrorDocumentを追記すれば本来は簡単にエラーページを上書きできる。
DocumentRoot
/var/www/html
# 503のエラーが発生した時、/var/www/html/503.htmlのページにアクセスするように設定
ErrorDocument
503
/503.html
ただリバースプロキシを使ってApacheとTomcatを連携していると、リバースプロキシの設定が優先処理されるらしく、ErrorDocumentが機能しない。
<VirtualHost
*:443>
DocumentRoot
/var/www/html
# リバースプロキシ設定が優先されてファイルが存在していても見つからない
ErrorDocument
503
/errors/503.html
ServerName
[ドメイン名]
SSLEngine
on
SSLProtocol
all
-SSLv2
SSLCertificateFile
[cert.pemのpath]
SSLCertificateKeyFile
[privkey.pemのpath]
SSLCertificateChainFile
[chain.pemのpath]
ProxyRequests
Off
SSLProxyEngine
On
ProxyPass
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
ProxyPassReverse
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
</VirtualHost>
仮に上のVirtualHost設定で、Tomcatを停止してサイトに繋ぐと下のようなエラー文が追加される。
Additionally, a 503 Service Unavailable error was encountered while trying to use an ErrorDocument to handle the request.
Proxy設定とProxyErrorOverrideを追加する
Proxyでは、特定のファイルやディレクトリにアクセスしてきた際に、その下のリバースプロキシを実行しない方法がある。
ProxyPass
/errors
!
ProxyPass
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
ProxyPassReverse
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
上のコードでは、
errors
というディレクトリにアクセスしてきた際はその下のリバースプロキシを実行しない。
さらにサーバエラーが発生した際に、Proxy設定を上書きして特定のページを参照させる方法がある。
ProxyErrorOverride On
ErrorDocument 503 /errors/503.html
ProxyErrorOverride On
でエラー時の遷移分けを有効化し、503エラーの時は
errors
ディレクトリ下の503.htmlにアクセスするように指定している。
まとめると次の通りで、これで503エラーページを上書きできる。
<VirtualHost
*:443>
DocumentRoot
/var/www/html
ServerName
[ドメイン名]
SSLEngine
on
SSLProtocol
all
-SSLv2
SSLCertificateFile
[cert.pemのpath]
SSLCertificateKeyFile
[privkey.pemのpath]
SSLCertificateChainFile
[chain.pemのpath]
ProxyRequests
Off
SSLProxyEngine
On
ProxyPass
/errors
!
ProxyPass
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
ProxyPassReverse
/
[ドメイン名]
/
[Tomcatのサイトディレクトリ]
ProxyErrorOverride
On
ErrorDocument
503
/errors/503.html
</VirtualHost>
1
1