На этот вопрос нужно было ответить долговременное назад, но я, может казаться, не понимаю это несмотря на чтение многих общих ответов, кто-то может указать, почему моя конфигурация не работает?
Цель: когда восходящий 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
появление в журналах.error_page
в обоих или также server
или location
блок.error_page
с proxy_intercept_errors on
в location
или server
блок;Ни один из них, кажется, не убеждает nginx отобразить мою ошибочную страницу. Почему нет? Что я пропустил?
Спасибо Джастину и Майклу за то, что они указали мне в правильном направлении, это действительно блок местоположения, вызывающий мои проблемы, в частности:
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;
}
Трудно сказать наверняка, не видя всю вашу конфигурацию, потому что это работает для меня без каких-либо дополнительных мер, которые вы предприняли. Сначала я попробовал всю вашу конфигурацию, а затем удалил биты один за другим, чтобы посмотреть, не изменилось ли что-нибудь.
Нет необходимости использовать proxy_intercept_errors, потому что 502 генерируется самим nginx, когда он не может подключиться к бэкэнду. . Я подтвердил, что это сработало для меня с этим набором и отключенным.
Все, что я добавил в свой серверный блок, это:
error_page 502 /error-502.html;
location = /error-502.html {
internal;
root /srv/www/errors;
}
В моей настройке мои статические страницы ошибок находятся в / srv / www / errors, но ничто другое не отличается.
У вас должна быть конфигурация где-нибудь на уровне сервера или в вашем блоке сервера, которая мешает или отменяет. Обратите внимание на правила приоритета для местоположений, это может быть фактором.