Linuxでサーバエラーページの変更

Linuxでサーバエラーページの変更

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>

2
2