Настройка nginx для повтора одного вышестоящего сервера

14

Я использую nginx в качестве обратного прокси-сервера и хотел бы подождать несколько секунд и повторить запрос, если вышестоящий сервер не отвечает. Таким образом, я могу перезапустить свой вышестоящий сервер, и вместо того, чтобы пользователи увидели 502 неисправных шлюза, их браузеры просто зависают на несколько секунд (процесс перезапуска занимает 3 или 4 секунды). Я попробовал пару вещей, я положил это в моем блоке сервера:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

но это, похоже, ничего не делало. Я также попытался добавить это в блок upstream:

server 127.0.0.1:3001 fail_timeout=10s;

опять не то что я хотел.

Это возможно? Что мне не хватает?

Джон
источник

Ответы:

1

Директивы, которые вы попробовали, предназначены для разных вещей, чем вы хотите. Прочитайте их документацию.

upstreamДиректива документация объясняет подробно , как работает вверх блок:

Если во время связи с сервером возникает ошибка, запрос будет передан следующему серверу и т. Д., Пока не будут опробованы все работающие серверы. Если успешный ответ не может быть получен ни с одного из серверов, клиент получит результат связи с последним сервером.

Там все сказано.

Однако вы можете обработать возвращенный код ошибки из бэкэнда, перехватывая его, proxy_intercept_errorsа затем отправляя $request_uriего специальному сценарию, который обрабатывает его от имени исходного клиента.

Базовая линия такова: вам нужно немного кода / логики приложения, чтобы повторить попытку на стороне клиента (или на стороне внешнего интерфейса).

Бернард Россет
источник
0

Как указано в другом ответе, встроенного способа заставить nginx сделать это не существует. Возможное решение - использовать настройку балансировки нагрузки, состоящую из текущего сервера и резервного сервера, который выполняет следующие действия для всех запросов:

  • опросить ваш текущий сервер, пока он не вернется в онлайн
  • затем ответьте 302 или другим перенаправлением, чтобы браузер повторил попытку

Этот сервер будет помечен флагом «резервное копирование», поэтому он будет пытаться работать только тогда, когда все остальные серверы отключены ( HTTP Load Balancing> Server Weights ).

user987356
источник