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
страница, которую я получаю при ошибке, по-прежнему остается такой же "Внутренняя ошибка сервера".
Какая моя ошибка?
Ответы
Ответ 1
error_page
обрабатывает ошибки, которые генерируются nginx. По умолчанию nginx будет возвращать то, что возвращает прокси-сервер, независимо от кода статуса http.
То, что вы ищете, это proxy_intercept_errors
Эта директива решает, будет ли nginx перехватывать ответы с помощью HTTP коды статуса 400 и выше.
По умолчанию все ответы будут отправляться как есть с прокси-сервера.
Если вы установите для этого значение, то nginx перехватит коды состояния, которые явно обрабатывается директивой error_page. Ответы со статусом коды, которые не соответствуют директиве error_page, будут отправлены как есть с прокси-сервера.
Ответ 2
Вы можете установить 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 других, что вам нужно
Ответ 3
Как упоминалось Stephen в этом ответе, использование proxy_intercept_errors on;
может работать.
Хотя в моем случае, как видно в этом ответе, использование uwsgi_intercept_errors on;
сделало трюк...
Ответ 4
Люди, которые используют FastCGI в качестве своего восходящего потока, нуждаются в этом параметре
fastcgi_intercept_errors on;
Для моего приложения PHP я использую его в своем блоке конфигурации вверх
location ~ .php$ { ## Execute PHP скриптs
fastcgi_pass php-upstream;
fastcgi_intercept_errors on;
error_page 500 /500.html;
}