Nginx y almacenamiento en búfer de grandes respuestas

Nginx y almacenamiento en búfer de grandes respuestas

En la configuración de nuestra aplicación, nginx actúa como un proxy inverso delante de gunicorn.

Nuestra aplicación responde a las solicitudes de frontend con respuestas generalmente pequeñas... pero algunos puntos finales generan respuestas que son más grandes que una página de memoria (4K).

Cuando esto sucede, nginx registra esta advertencia:

an upstream response is buffered to a temporary file 
/path/to/nginx/proxy_temp/4/86/0000000864 while reading upstream, 
client: 1.2.3.4, server: api.ourdomain.com, request: "GET /pdf/..."

Nuestros registros de nginx terminan inundados con esta advertencia y, hasta donde puedo ver, las únicas soluciones para hacer que esta advertencia desaparezca de nuestros registros sonmalas soluciones:

  • Puedo configurar nginx proxy_max_temp_file_sizeen 0, básicamente deshabilitando el almacenamiento en búfer de respuestas grandes. Esto detendría el almacenamiento en búfer de los archivos, pero también significaría que para los puntos finales que generan respuestas grandes (por ejemplo, los que generan PDF y crean respuestas de 1 a 2 MB), un cliente de consumo lento detendría al correspondiente trabajador gunicorn... De hecho, si hubiera son N trabajadores de gunicorn, solo se necesitarían N clientes generando archivos PDF detrás de conexiones de red lentas, y nuestra aplicación estaría inactiva...

  • Puedo aumentarlo proxy_buffer_sizea más de 4K (es decir, una página de memoria). Estoy bastante seguro de que esto tendría un impacto severo en el rendimiento de nginx: el 70% de nuestras respuestas caben en 4K, y obligaríamos a nginx a asignar... ¿qué? ¿2 MB de buffers para cada uno de ellos, solo para estar listo para la solicitud ocasional de generación de PDF? EDITAR: De hecho, esto no es una opción en absoluto. Michael (abajo) comentó que los únicos valores permitidos son 4K y 8K.

  • Podría apagarlo proxy_buffering, pero eso es tan malo como la primera solución (clientes lentos => muerte).

En esencia, nginx inunda nuestros registros sobre algo que QUEREMOS: almacenamiento temporal en archivos cuando las respuestas son grandes.

Solo queremos evitar que esto inunde nuestros registros, "marcándolo" como que no es realmente una advertencia (ni siquiera estoy seguro de por qué es una advertencia; ¿sobre qué "cosa mala" nos advierte?)

Además de editar nginxel código fuente y recompilar, ¿me falta alguna otra solución?

Respuesta1

Este es el resultado del nivel de registro en la directiva error_log de Nginx.

https://www.nginx.com/resources/admin-guide/logging-and-monitoring/

error_log logs/error.log warn;

Se registran mensajes de niveles de advertencia, error crítico, alerta y emergencia.

La configuración predeterminada del registro de errores funciona globalmente. Para anularlo, coloque la directiva error_log en el contexto de configuración principal (nivel superior). Las configuraciones en el contexto principal siempre son heredadas por otros niveles de configuración. La directiva error_log también se puede especificar en los niveles http, flujo, servidor y ubicación y anula la configuración heredada de los niveles superiores.

Esa línea sobre el almacenamiento en búfer está en el nivel de advertencia:

[warn] 30055#0: *1428 an upstream response is buffered to a temporary file 

Entonces, si se asegura de que su nivel de registro de errores no esté configurado para advertir, es decir, lo deja en el valor predeterminado o lo disminuye, entonces ya no verá esa advertencia. Cualquiera de las siguientes soluciones los suprimirá:

Déjelo en el valor predeterminado (nivel 'error' y superior):

error_log logs/error.log;

La misma cosa:

error_log logs/error.log error;

También puede aumentar el umbral más allá de error, hasta crit, alerty emerg.

información relacionada