52

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 を実行しcat、ファイルを取得できることを確認したため、権限の問題ではありません。上記の構成ファイルを使用するとservice nginx reload、エラーで受け取るページは同じ「内部サーバー エラー」のままです。

私のエラーは何ですか?

4

4 に答える 4

102

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

あなたが探しているのはproxy_intercept_errorsです

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

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

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

于 2012-01-03T16:48:12.110 に答える
22

特にその場所に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個の他のステータスに設定できます

于 2012-12-24T17:58:18.523 に答える