-100p

-10p

+10p

+100p

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

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

-100p

-10p

+10p

+100p