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
.Respuestas:
En realidad no pude reproducir esto en:
Configuré esto en mi nginx.conf:
Luego configuro dos servidores de prueba. Uno que simplemente agotaría el tiempo de espera en el SYN, y uno que aceptaría conexiones pero nunca respondería:
Luego envié una conexión de prueba:
Luego vi error_log que mostró esto:
luego:
Y luego el acceso.log que tiene el tiempo de espera esperado de 30 años (10 + 20):
Aquí está el formato de registro que estoy usando, que incluye los tiempos de espera ascendentes individuales:
fuente
proxy_send_timeout
) y, como la ha configurado en un nivel superiorproxy_connection_timeout
, eso puede explicar cualquier retraso en los 20 segundosproxy_read_timeout
. Cuando dices "escupir líneas muy lentamente", ¿qué quieres decir?proxy_read_timeout
que falla la solicitud por completo o lo permite por completo. Esto también explica la diferencia entre el comportamiento que ves y el comportamiento que yo veo.El tiempo de espera de conexión significa que el TCP se detiene cuando se establece el protocolo de enlace (por ejemplo, no hubo SYN_ACKs). TCP volvería a intentar enviar SYN, pero solo ha dado 2 segundos. a Nginx para usar otro servidor, por lo que simplemente no tiene tiempo para volver a enviar SYN.
UPD : No se pudo encontrar en los documentos, pero tcpdump muestra que hay 3 segundos. retraso entre el primer SYN enviado y el segundo intento de enviar SYN.
fuente