Подтвердить что ты не робот

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

Какая моя ошибка?

4b9b3361

Ответ 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;
 }