una respuesta aguas arriba se almacena en un archivo temporal


61

Tengo bastante grandes y lentos (datos complejos, complejos frontend) de aplicaciones web construir en RoRy servido por Pumala nginxproxy como inversa. Mirando el nginxregistro de errores, veo bastantes entradas como:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Tengo curiosidad, ya que es muy poco probable que la página siga siendo la misma para diferentes usuarios y diferentes interacciones de los usuarios, y no creo que sea necesario / útil almacenar en búfer la respuesta en el disco.

Lo sé proxy_max_temp_file_sizey lo configuro en 0, pero me parece un poco incómodo (mi proxy intenta almacenar en búfer, pero no tiene ningún archivo donde almacenar ... ¿cómo puede ser más rápido?).

Mis preguntas son:

  1. ¿Cómo puedo eliminar la [advertencia] y evitar el almacenamiento en búfer de respuestas? ¿Es mejor apagar proxy_bufferingo establecer proxy_max_temp_file_sizeen 0? ¿Por qué?

  2. Si nginxalmacena una respuesta: ¿Cuándo sirve la respuesta almacenada, a quién y por qué?

  3. ¿Por qué se nginxenciende proxy_bufferingpor defecto y luego [te advierte] si en realidad amortigua una respuesta?

  4. ¿Cuándo una respuesta activa esa opción? Cuando se tarda> unos segundos (¿cuántos?) Para servir la respuesta? ¿Es esto configurable?

TIA, ngw.


1
Tengo la sensación de que estás confundiendo el almacenamiento en búfer con el almacenamiento en caché. El almacenamiento en búfer es el procedimiento que permite cargar más datos de los permitidos por la asignación de memoria.
Eslavo

Respuestas:


75

1) ¿Cómo puedo eliminar la [advertencia] y evitar el almacenamiento en búfer de respuestas? ¿Es mejor desactivar proxy_buffering o establecer proxy_max_temp_file_size en 0? ¿Por qué?

Debe establecerlo proxy_max_temp_file_sizeen 0 para eliminarlo. La proxy_bufferingdirectiva no está directamente relacionada con la advertencia. Puede desactivarlo para detener cualquier almacenamiento en búfer, pero eso no se recomienda en general (a menos que sea necesario para Comet ).

2) Si nginx almacena una respuesta, ¿cuándo sirve la respuesta almacenada, a quién y por qué?

Servirá de inmediato, pero un cliente generalmente tiene una conexión mucho más lenta y no puede consumir los datos de respuesta tan rápido como los produce su aplicación. Nginx intenta almacenar la respuesta completa para liberar su aplicación lo antes posible.

Ver también: http://aosabook.org/en/nginx.html

3) ¿Por qué nginx activa proxy_buffering de forma predeterminada y luego [le advierte] si realmente almacena una respuesta?

Como ya mencioné, el proxy_bufferingno está directamente relacionado con la advertencia. Generalmente se necesita para operaciones proxy optimizadas y desactivarlo degrada el rendimiento y el rendimiento.

Nginx solo le advierte cuando una respuesta no cabe en los buffers de memoria configurados. Puede ignorar la advertencia si está bien para usted.

4) ¿Cuándo una respuesta activa esa opción? ¿Cuándo tarda más de unos segundos (¿cuántos?) Para responder la respuesta? ¿Es esto configurable?

Se dispara cuando las memorias intermedias están llenas. Por favor, mire los documentos, se explica todo el mecanismo: http://nginx.org/r/proxy_max_temp_file_size

Es posible que desee aumentar las memorias intermedias.


55
Para el n. ° 1, ¿cómo la eliminación del límite de tamaño de los archivos temporales evita la advertencia de almacenamiento en búfer? No creo que esto sea correcto porque tengo esta directiva establecida en 0 y todavía recibo advertencias.
Phil

Esta respuesta no es lo suficientemente claro, es mejor para el rendimiento para ajustar la proxy_max_temp_file_sizea 0, o esto es sólo una forma de eliminar esa advertencia?
Offir Pe'er

12

La siguiente configuración funciona bien en mi servidor.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
¿La segunda directiva es redundante, es decir, 16ken la primera línea está haciendo exactamente lo mismo que la segunda línea?
EoghanM

1
@EoghanM según los documentos, no. Proxy_Buffer_size (buffer, no plural) se aplica a la primera parte de la respuesta del servidor proxy (también conocido como los encabezados) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers es para el resto de la respuesta.
cde

2
Hoy me has guardado algo de mi cabello. Estaba moviendo nginx de nuestro servidor a un contenedor acoplable y comenzó a ser INCREÍBLEMENTE lento. Esto lo "solucionó". No estoy seguro de si la versión en nuestro servidor tenía esto por defecto o no, pero la que está en el contenedor definitivamente necesitaba esta configuración.
Krystian
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.