vasilevkirill
@vasilevkirill
Сертифицированный тренер MikroTik TR0417

Nginx reverse proxy в зависимости от ответа сервера?

Всем привет,
Покажите, в каком направлении двигаться если это вообще возможно
Имеется nginx, работает как обратный прокси и перенаправляет все запросы на 10.10.10.10:8000
Всё работает замечательно, но есть один нюанс, периодически сервер 10.10.10.10 отдаёт 401-ое сообщение об отсутствие авторизации.
Задача следующая, если от сервера пришло 401, то необходимо перебросить на 10.10.10.11:8888
Не могу сообразить как можно фильтровать ответы от сервера
  • Вопрос задан
  • 979 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Традиционное решение проблемы
location / {
    proxy_pass http://10.10.10.10:8000;
    proxy_intercept_errors on;
    error_page 401 = @fallback;
}

location @fallback {
    proxy_pass http://10.10.10.11:8888;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@xtreme
Снимаю порчу по SSH :)
В такой ситуации стоило бы сначала разобраться, почему отдается 401 от бэкенда. И на бэкенде заменил 401 на другую ошибку (как пример 404). Например, если на бэкенде тоже nginx, то это делается просто директивой error_page. Ну а на фронтенде включить второй сервер в апстрим с параметром backup и proxy_next_upstream http_404;
В этом случае запрос уйдет на второй бэкенд.

Как вариант немного посложнее (я бы, например, поступил так) - взять исходники nginx, найти там модуль proxy, написать по образу и подобию обработки других ошибок кусок кода для обработки http_401, сделать патч на будущее (пригодится при обновлениях), собрать свой пакет с измененными исходниками и проапгрейдиться. Ну а дальше по накатанной - proxy_next_upstream http_401; и сервер в апстриме с параметром backup.

В любом случае, маловато информации - почему возникает ошибка? Она там должна быть или это какой-то баг? Можно ли исправить баг, если это баг? Есть ли смысл в другом бэкенде, если получен 401? Возможно, если не надо дальше обрабатывать запрос, а отдавать запросу заглушку, просто отдать заглушку?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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