nginx не обслуживает мою страницу ошибок - PullRequest
38 голосов
/ 03 января 2012

У меня есть приложение Sinatra, размещенное с Unicorn, и перед ним 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 есть, и у меня есть sudo'd как www-data (Ubuntu) и проверено, что я могу cat файл, таким образом, это не разрешениепроблема.С указанным выше файлом конфигурации и service nginx reload страница, которую я получаю при ошибке, остается той же самой «Внутренней ошибкой сервера».

В чем моя ошибка?

Ответы [ 4 ]

75 голосов
/ 03 января 2012

error_page обрабатывает ошибки, сгенерированные nginx. По умолчанию nginx возвращает все, что возвращает прокси-сервер, независимо от кода состояния http.

Что вы ищете, это proxy_intercept_errors

Эта директива решает, будет ли nginx перехватывать ответы с HTTP коды состояния от 400 и выше.

По умолчанию все ответы будут отправлены как есть с прокси-сервера.

Если вы включите это, то nginx будет перехватывать коды состояния, которые явно обрабатывается директивой error_page. Ответы со статусом коды, которые не соответствуют директиве error_page, будут отправлены как есть с прокси-сервера.

17 голосов
/ 24 декабря 2012

Вы можете установить 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 других статусов, что вам нужно

4 голосов
/ 22 ноября 2017

Люди, которые используют FastCGI в качестве восходящего потока, нуждаются в включении этого параметра

fastcgi_intercept_errors on;

Для моего PHP-приложения я использую его в своем исходном блоке конфигурации

 location ~ .php$ { ## Execute PHP scripts
    fastcgi_pass   php-upstream; 
    fastcgi_intercept_errors on;
    error_page 500 /500.html;
 }
0 голосов
/ 14 февраля 2017

Как упомянул Стивен в этом ответе , использование proxy_intercept_errors on; может работать.Хотя в моем случае, как видно в этом ответе , использование uwsgi_intercept_errors on; дало результат ...

...