nginx не обслуживает мою error_page

У меня есть приложение 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 страница, которую я получаю при ошибке, все еще та же «Внутренняя ошибка сервера».

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


person François Beausoleil    schedule 03.01.2012    source источник


Ответы (4)


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

Вы ищете proxy_intercept_errors.

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

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

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

person Stephen Emslie    schedule 03.01.2012
comment
Я знал, что это вопрос RTFM. Спасибо, что нашли время дать отличный ответ! - person François Beausoleil; 03.01.2012
comment
Небольшое примечание к ответу четырехлетней давности - теперь proxy_intercept_errors работает с ошибками, равными или превышающими 300. - person Tisho; 25.02.2016
comment
После включения этой директивы настраиваемая страница ошибок включается, но настраиваемые заголовки ответов, отправленные из восходящего потока, удаляются. Есть идеи, как решить эту часть? - person Vinay Mundada; 20.05.2020

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

person Alexey    schedule 24.12.2012
comment
Использование proxy_intercept_errors; (без аргументов) больше не действует в текущем nginx. Вместо этого используйте proxy_intercept_errors on;. - person Marian; 02.12.2014
comment
Быстрый вопрос о семантике здесь ... установка proxy_intercept_errors на on означает, что пользовательская страница возвращается, а установка на off означает, что возвращается страница nginx, правильно? - person speedplane; 14.06.2016
comment
Я использую FASTCGI, даже если я включу proxy_intercept_errors, он все равно не перехватит ошибку. Он даже не перехватит ошибку 404. - person Aftab Naveed; 22.11.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;
 }
person Aftab Naveed    schedule 22.11.2017

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

person ppython    schedule 13.02.2017