Comencé a usar Nginx como proxy inverso para un conjunto de servidores que proporcionan algún tipo de servicio.
El servicio puede ser bastante lento a veces (se está ejecutando en Java y la JVM a veces se atasca en una "recolección de basura completa" que puede tomar varios segundos), así que configuré proxy_connect_timeout
2 segundos, lo que le dará a Nginx suficiente tiempo para calcular El servicio está atascado en el GC y no responderá a tiempo, y debe pasar la solicitud a un servidor diferente.
También configuré proxy_read_timeout
para evitar que el proxy inverso se atasque si el servicio en sí toma demasiado tiempo para calcular la respuesta; nuevamente, debe mover la solicitud a otro servidor que debería ser lo suficientemente libre como para devolver una respuesta oportuna.
He ejecutado algunos puntos de referencia y puedo ver claramente que proxy_connect_timeout
funciona correctamente, ya que algunas solicitudes regresan exactamente en el tiempo especificado para el tiempo de espera de la conexión, ya que el servicio está atascado y no acepta conexiones entrantes (el servicio está utilizando Jetty como incrustado servlet contenedor). El proxy_read_timeout
también funciona, ya que puedo ver las solicitudes que regresan después del tiempo de espera especificado allí.
El problema es que habría esperado ver algunas solicitudes que expiran después de ese tiempo proxy_read_timeout + proxy_connect_timeout
, o casi ese período de tiempo, si el servicio está atascado y no acepta conexiones cuando Nginx intenta acceder, pero antes de que Nginx pueda expirar, se libera e inicia el procesamiento, pero es demasiado lento y Nginx abortaría debido al tiempo de espera de lectura. Creo que el servicio tiene tales casos, pero después de ejecutar varios puntos de referencia, totalizando varios millones de solicitudes, no pude ver una sola solicitud que regrese en algo anterior proxy_read_timeout
(que es el tiempo de espera más grande).
Agradecería cualquier comentario sobre este problema, aunque creo que podría deberse a un error en Nginx (aún no he visto el código, por lo que esto es solo una suposición) de que el contador de tiempo de espera no se restablece después de la conexión es exitoso si Nginx no leyó nada del servidor ascendente.
proxy_read_timeout
que no es el "tiempo de espera global", sino entre 2 operaciones de lectura.
proxy_read_timeout + proxy_connect_timeout
.