概要
nginxのデフォルトのエラーページを返さないようにカスタムエラーページを設定する。
リバースプロキシとして使用する際、httpディレクティブとserverディレクティブのerror_pageの書き方によってどのようにエラーページを返すか、実際に50xエラーを発生させて確認したので内容のまとめ
インフラの準備
- EC2でnginxを2台準備
- 1台はリバースプロキシとして使用
- 1台は転送先として使用
- 転送先にはphp-fpmを入れてFastCGIが利用できる様にしておく
※phpで意図的に50xを発生させるために必要
nginxの設定
リバースプロキシ
proxy.conf
upstream origin {
server 1.2.3.4:80;
}
server {
proxy_read_timeout 5;
proxy_connect_timeout 5;
proxy_send_timeout 5;
listen 8080;
server_name localhost;
location / {
proxy_pass http://origin;
}
}
50xのエラーコードを発生させる準備
リバースプロキシでエラーを発生させる
-
502エラー
転送先のnginxを停止させた状態でリバースプロキシから転送先にリダイレクトすると502エラーが発生する -
504エラー
転送先に下記の様に10秒待機後、Hello World
が表示されるphpを置いてここにアクセスする
nginxのタイムアウト設定を5秒にしているのでタイムアウトして504エラーが発生する
/usr/share/nginx/html/phptest.php
<?php
sleep(10); die( 'Hello World' );
?>
転送先でエラーを発生させる
- 50xエラー
下記の様に該当のエラーコードを返すphpをエラーコードの分だけ作成する
ここにアクセスすると該当のエラーが発生する
/usr/share/nginx/html/500.php
<?php
header("Status: 500 Internal Server Error");
?>
error_pageの書き方
httpディレクティブで全体の設定を入れてリバースプロキシ毎のserverディレクティブで個別の設定を入れてみる
custome-error.html
が用意したカスタムエラーページです
検証結果
- serverディレクティブに書いた
error_page
で返す - 転送先でエラーが発生した場合、serverディレクティブでエラーコードが定義されていればそれを返す
- 定義されていない場合は転送先のエラーを返す
- serverディレクティブ内の
error_page
を削除すると転送先のcustome-error.html
を見ようとして404になった