2012-01-03 2 views
30

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

Какая у меня ошибка?

ответ

60

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

Что вы ищете является proxy_intercept_errors

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

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

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

+1

Я знал, что это вопрос RTFM. Спасибо, что нашли время, чтобы дать отличный ответ! –

+9

Просто быстрое примечание к 4-летнему ответу - теперь 'proxy_intercept_errors' работает для ошибок равных или больших до 300. – Tisho

12

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

+5

Использование' proxy_intercept_errors; '(без аргумента) больше не действует в текущем nginx. Вместо этого используйте 'proxy_intercept_errors on''. – Marian

+0

Привет, Мариан, спасибо за получение – Alexey

+0

Быстрый вопрос о семантике здесь ... Установка 'proxy_intercept_errors' на' on' означает, что пользовательская страница возвращается, а установка 'off' означает, что страница nginx возвращается, правильно? – speedplane

0

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

0

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

fastcgi_intercept_errors on; 

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

location ~ .php$ { ## Execute PHP scripts 
    fastcgi_pass php-upstream; 
    fastcgi_intercept_errors on; 
    error_page 500 /500.html; 
} 
Смежные вопросы