Configurazione di nginx per ritentare un singolo server upstream


14

Sto usando nginx come proxy inverso e vorrei che attendesse un certo numero di secondi e ritentasse una richiesta se il server upstream non risponde. In questo modo posso riavviare il mio server upstream e invece di vedere 502 gateway non validi, i loro browser si bloccano solo per alcuni secondi (il processo di riavvio richiede 3 o 4 secondi). Ho provato un paio di cose, l'ho messo nel mio blocco server:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

ma non sembrava fare nulla. Ho anche provato ad aggiungere questo al blocco upstream:

server 127.0.0.1:3001 fail_timeout=10s;

di nuovo, non quello che volevo.

È possibile? Cosa mi sto perdendo?

Risposte:


1

Le direttive che hai provato sono pensate per cose diverse da quelle che desideri. Leggi la loro documentazione.

La upstreamdocumentazione della direttiva spiega a fondo come funziona un blocco a monte:

Se si verifica un errore durante la comunicazione con un server, la richiesta verrà passata al server successivo e così via fino a quando non verranno provati tutti i server funzionanti. Se non è possibile ottenere una risposta corretta da nessuno dei server, il client riceverà il risultato della comunicazione con l'ultimo server.

Tutto detto lì.

Tuttavia, potresti essere in grado di elaborare il codice di errore restituito dal back-end intercettandolo proxy_intercept_errorse quindi inviarlo $request_uria uno script speciale che lo gestisce per conto del client originale.

La linea di base è: è necessario un po 'di codice / logica dell'applicazione per riprovare sul lato client (o frontend).


0

Come affermato in un'altra risposta, non esiste un modo integrato per fare in modo che nginx lo faccia. Una possibile soluzione consiste nell'utilizzare un'impostazione di bilanciamento del carico composta dal server corrente e da un server di backup che esegua le seguenti operazioni per tutte le richieste:

  • esegui il polling del tuo server corrente fino a quando non sarà di nuovo online
  • quindi rispondi con un 302 o altro reindirizzamento in modo che il browser riprovi

Questo server verrebbe contrassegnato con il flag 'backup' in modo che venga provato solo quando tutti gli altri server sono offline ( Bilanciamento carico HTTP> Pesi server ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.