Konfigurowanie nginx w celu ponownej próby pojedynczego serwera nadrzędnego

14

Używam nginx jako odwrotnego proxy i chciałbym, aby poczekał pewną liczbę sekund i ponowił żądanie, jeśli serwer nadrzędny nie odpowiada. W ten sposób mogę zrestartować mój serwer nadrzędny i zamiast widzieć 502 złą bramę, ich przeglądarki zawieszają się na kilka sekund (proces restartu trwa 3 lub 4 sekundy). Próbowałem kilku rzeczy, umieściłem to w bloku serwera:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

ale wydaje się, że nic nie robi. Próbowałem także dodać to do bloku nadrzędnego:

server 127.0.0.1:3001 fail_timeout=10s;

znowu nie to, co chciałem.

czy to możliwe? czego mi brakuje?

Jan
źródło

Odpowiedzi:

1

Wytyczne, które wypróbowałeś, mają na celu inne rzeczy niż chcesz. Przeczytaj ich dokumentację.

Dokumentacja upstreamdyrektywy dokładnie wyjaśnia, jak działa blok upstream:

Jeśli podczas komunikacji z serwerem wystąpi błąd, żądanie zostanie przekazane do następnego serwera i tak dalej, dopóki wszystkie działające serwery nie zostaną wypróbowane. Jeśli nie uda się uzyskać pomyślnej odpowiedzi z żadnego z serwerów, klient otrzyma wynik komunikacji z ostatnim serwerem.

Wszystko tam powiedziane.

Jednak może być w stanie przetworzyć zwrócony kod błędu z zaplecza, przechwytując go, proxy_intercept_errorsa następnie wysyłając $request_urido specjalnego skryptu obsługującego go w imieniu oryginalnego klienta.

Podstawa jest następująca: potrzebujesz logiki kodu / aplikacji, aby spróbować ponownie po stronie klienta (lub frontendu).

Bernard Rosset
źródło
0

Jak stwierdzono w innej odpowiedzi, nie ma wbudowanego sposobu na to, aby Nginx to zrobił. Możliwym rozwiązaniem jest użycie konfiguracji równoważenia obciążenia składającej się z bieżącego serwera i serwera kopii zapasowej, który wykonuje następujące czynności dla wszystkich żądań:

  • odpytuj swój obecny serwer, dopóki nie wróci do trybu online
  • następnie odpowiedz przekierowaniem 302 lub innym, aby przeglądarka spróbowała ponownie

Serwer ten zostałby oznaczony flagą „kopii zapasowej”, aby można go było wypróbować tylko wtedy, gdy wszystkie inne serwery są w trybie offline ( równoważenie obciążenia HTTP> Wagi serwera ).

użytkownik987356
źródło