2012-01-03 17 views
30

私はUnicornでホストされているSinatraアプリケーションとその前にnginxを持っています。 Sinatraアプリケーションがエラー(500を返す)をすると、デフォルトの "Internal Server Error"ではなく静的ページを提供したいと思います。したがって、権限の問題ではない、nginxが私のerror_pageを提供していません

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-データ(Ubuntuの)としてsudo'dと私はファイルをcatすることができます確認しました:私は、次のnginxの構成を有しています。上記の設定ファイルとservice nginx reloadを使用すると、エラーで受信したページは同じ "内部サーバーエラー"です。

私のエラーは何ですか?

答えて

60

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

proxy_intercept_errors

nginxのは400と高いのHTTP ステータスコードとレスポンスをインターセプトした場合、このディレクティブは決定しています。

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

これをオンに設定すると、nginxはerror_page指令で明示的に処理される というステータスコードを代行受信します。 error_page指示文と一致しない状態 のコードを持つ応答は、そのままプロキシされたサーバーから として送信されます。

+1

私はそれがRTFMの問題であることを知っていました。素晴らしい答えを提供する時間をとってくれてありがとう! –

+9

4年前のレスポンスへのちょっとしたメモ - 今度は 'proxy_intercept_errors'は300以上のエラーで動作します。 – Tisho

12

あなたは、その場所

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; 
} 

のために特にproxy_intercept_errorsを設定することができますし、働くことができるproxy_intercept_errors on;を使用して、スティーブンin this responseで述べたように、あなたが

+5

' proxy_intercept_errors; '(引数なし)を使うと、現在のnginxでは有効ではなくなりました。代わりに 'proxy_intercept_errors on;'を使用してください。 – Marian

+0

こんにちはマリアン、入手していただきありがとうございます – Alexey

+0

ここでのセマンティクスについての簡単な質問... 'proxy_intercept_errors'を' on'に設定すると、カスタムページが返され、 'off'に設定されているとnginxページが返されます。 – speedplane

0

を必要とするものを代わりに200他のステータスを設定することができます。 uwsgi_intercept_errors on;を使用して私の場合 ものの、in this answer見られるように、...その上流の必要性としてはFastCGIを使用している

0

人々は、このパラメータには、私が使用しています、私のPHPアプリケーションの場合

fastcgi_intercept_errors on; 

上のトリックになりましたそれは私のアップストリームコンフィギュレーションブロックにあります

location ~ .php$ { ## Execute PHP scripts 
    fastcgi_pass php-upstream; 
    fastcgi_intercept_errors on; 
    error_page 500 /500.html; 
} 
関連する問題