web-dev-qa-db-ja.com

nginxがerror_pageを提供していません

UnicornでホストされているSinatraアプリケーションがあり、その前にnginxがあります。 Sinatraアプリケーションがエラー(500を返す)になったとき、デフォルトの「内部サーバーエラー」ではなく、静的なページを提供したいと思います。私は次のnginx設定を持っています:

server {
  listen 80 default;
  server_name *.example.com;
  root /home/deploy/www-frontend/current/public;

  location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_Host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
  }

  error_page 500 502 503 504 /50x.html;
}

Error_pageディレクティブがあり、www-data(Ubuntu)としてSudo'dし、ファイルをcatできることを確認しました。したがって、許可の問題ではありません。上記の構成ファイルとservice nginx reload、エラー時に受け取るページは同じ「内部サーバーエラー」のままです。

私のエラーは何ですか?

40

error_pageは、nginxによって生成されたエラーを処理します。デフォルトでは、nginxは、httpステータスコードに関係なく、プロキシサーバーが返すものをすべて返します。

探しているのは proxy_intercept_errors

このディレクティブは、nginxがHTTPステータスコード400以上の応答をインターセプトするかどうかを決定します。

デフォルトでは、すべての応答はプロキシされたサーバーからそのまま送信されます。

これをonに設定すると、nginxはerror_pageディレクティブによって明示的に処理されるステータスコードをインターセプトします。 error_pageディレクティブと一致しないステータスコードを持つ応答は、プロキシされたサーバーからそのまま送信されます。

76
Stephen Emslie

特にその場所にproxy_intercept_errorsを設定できます

location /some/location {
    proxy_pass_header Server;
    proxy_set_header Host $http_Host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
    proxy_intercept_errors on; # see http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

    error_page 400 500 404 ... other statuses ... =200 /your/path/for/custom/errors;
}

代わりに200のステータスを必要なものに設定できます

17
Alexey

アップストリームとしてFastCGIを使用しているユーザーは、このパラメーターをオンにする必要があります

fastcgi_intercept_errors on;

PHPアプリケーションの場合、アップストリーム構成ブロックで使用しています

 location ~ .php$ { ## Execute PHP scripts
    fastcgi_pass   php-upstream; 
    fastcgi_intercept_errors on;
    error_page 500 /500.html;
 }
4
Aftab Naveed

Stephen この応答で で述べたように、proxy_intercept_errors on;を使用しても機能します。私の場合、見られるように この答えでuwsgi_intercept_errors on;を使用してトリックをしました...

0
ppython