Ho iniziato a utilizzare Nginx come proxy inverso per un set di server che forniscono una sorta di servizio.
Il servizio può essere piuttosto lento a volte (il suo funzionamento su Java e JVM a volte si blocca nella "raccolta completa dei rifiuti" che potrebbe richiedere diversi secondi), quindi ho impostato i proxy_connect_timeout
2 secondi, il che darà a Nginx il tempo sufficiente per capire che il servizio è bloccato su GC e non risponderà in tempo, e dovrebbe passare la richiesta a un altro server.
Ho anche impostato proxy_read_timeout
per impedire che il proxy inverso si blocchi se il servizio stesso impiega troppo tempo per calcolare la risposta - di nuovo, dovrebbe spostare la richiesta su un altro server che dovrebbe essere abbastanza libero da restituire una risposta tempestiva.
Ho eseguito alcuni benchmark e vedo chiaramente che proxy_connect_timeout
funziona correttamente poiché alcune richieste ritornano esattamente nel tempo specificato per il timeout della connessione, poiché il servizio è bloccato e non accetta connessioni in entrata (il servizio utilizza Jetty come incorporato contenitore servlet). Il proxy_read_timeout
funziona anche, come posso vedere le richieste che il ritorno dopo il timeout non specificato.
Il problema è che mi sarei aspettato di vedere alcune richieste di timeout dopo proxy_read_timeout + proxy_connect_timeout
, o quasi per quel periodo di tempo, se il servizio è bloccato e non accetta connessioni quando Nginx tenta di accedervi, ma prima che Nginx possa scadere - viene rilasciato e inizia l'elaborazione, ma è troppo lento e Nginx si interromperà a causa del timeout di lettura. Credo che il servizio abbia casi del genere, ma dopo aver eseguito diversi benchmark, per un totale di diversi milioni di richieste, non sono riuscito a vedere una singola richiesta che ritorna in qualsiasi cosa sopra proxy_read_timeout
(che è il timeout più grande).
Gradirei qualsiasi commento su questo problema, anche se penso che potrebbe essere dovuto a un bug in Nginx (devo ancora guardare il codice, quindi questo è solo un presupposto) che il contatore del timeout non viene ripristinato dopo la connessione ha esito positivo, se Nginx non ha letto nulla dal server upstream.
proxy_read_timeout
non è il "timeout globale", ma tra 2 operazioni di lettura.
proxy_read_timeout + proxy_connect_timeout
.