Выгода в восходящем направлении вниз (502) ошибки и отображает пользовательскую ошибочную страницу

На этот вопрос нужно было ответить долговременное назад, но я, может казаться, не понимаю это несмотря на чтение многих общих ответов, кто-то может указать, почему моя конфигурация не работает?

Цель: когда восходящий server_api снижается (скажите, его рабочие процессы отказал), я хочу, чтобы nginx отобразил мою пользовательскую ошибочную страницу.

Моя конфигурация:

location @server {
    proxy_pass http://server_api;
    proxy_redirect off;
    ...

    proxy_intercept_errors on;
    error_page 502 /error-502.html;
}

error_page 502 /error-502.html;

location = /error-502.html {
    internal;
    root /srv/my-server/html;
}

Мои шаги:

  • У меня есть своя статическая ошибочная страница в /srv/my-server/html/error-502.html готовый, то же разрешение и владельцы как другие статические активы.
  • Я остановил свой восходящий сервис и вижу [error] 2359#0: *25 connect() failed (111: Connection refused) while connecting to upstream появление в журналах.
  • Теперь я пытаюсь составить свое пользовательское ошибочное шоу страницы 502 ошибок.
  • Я попытался установить error_page в обоих или также server или location блок.
  • Я попробовал error_page с proxy_intercept_errors on в location или server блок;

Ни один из них, кажется, не убеждает nginx отобразить мою ошибочную страницу. Почему нет? Что я пропустил?

2
задан 4 April 2015 в 21:33
2 ответа

Спасибо Джастину и Майклу за то, что они указали мне в правильном направлении, это действительно блок местоположения, вызывающий мои проблемы, в частности:

location / {
    try_files   $uri $uri/ @server;
    error_page  403 = @server;
}

В основном , Я пытался проявить смекалку и поймать ошибку $ uri / (ошибка 403 возникает, когда вы пытаетесь получить доступ к папке, которая существует, но не имеет индексного файла или автоматической индексации), и перенаправить ее на @server блок тоже.

Но разве не достаточно одного try_files $ uri $ uri / @server; ?

Представьте, что вы пытаетесь получить доступ к http://example.com / , nginx скажет, о, эта папка существует (это ваш корень ), но индекс не найден, и выдаст 403 вместо передачи в блок @server .

Таким образом, мое решение 403 , но я не понимал, что за это приходится платить: это означает, что nginx уже обнаружил ошибку и использовал error_page в том же блоке location для ее обработки (передав его в (скрытый ) это с моими тестами в вопросе, он предполагает, что nginx (v1.7.x) будет дальше игнорировать директиву error_page на этом этапе и использовать вместо нее значение по умолчанию 502.

Интересная часть: как мы можем обойти это?

Мое решение состоит в том, чтобы вместо этого настроить точное соответствие корневого маршрута, теперь перехват 403 на корневом сервере больше не нужен, и error_page работает должным образом.

error_page 502 /error-502.html;

location = /error-502.html {
    internal;
    root /srv/example.com/html;
}

location = / {
    try_files $uri @server;
}

location / {
    try_files $uri $uri/ @server;
}
5
ответ дан 3 December 2019 в 09:16

Трудно сказать наверняка, не видя всю вашу конфигурацию, потому что это работает для меня без каких-либо дополнительных мер, которые вы предприняли. Сначала я попробовал всю вашу конфигурацию, а затем удалил биты один за другим, чтобы посмотреть, не изменилось ли что-нибудь.

Нет необходимости использовать proxy_intercept_errors, потому что 502 генерируется самим nginx, когда он не может подключиться к бэкэнду. . Я подтвердил, что это сработало для меня с этим набором и отключенным.

Все, что я добавил в свой серверный блок, это:

error_page 502 /error-502.html;

location = /error-502.html {
  internal;
  root /srv/www/errors;
}

В моей настройке мои статические страницы ошибок находятся в / srv / www / errors, но ничто другое не отличается.

У вас должна быть конфигурация где-нибудь на уровне сервера или в вашем блоке сервера, которая мешает или отменяет. Обратите внимание на правила приоритета для местоположений, это может быть фактором.

1
ответ дан 3 December 2019 в 09:16

Теги

Похожие вопросы