10

Я использую 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;

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

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

2 ответа2

1

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

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

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

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .