
Tengo una aplicación web bastante grande y lenta (datos complejos, interfaz compleja) integrada RoR
y servida Puma
como nginx
proxy inverso. Al mirar el nginx
registro 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 bastante 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 almacenar la respuesta en el disco sea necesario/útil.
Lo sé proxy_max_temp_file_size
y lo establecí en 0, pero me parece un poco incómodo (mi proxy intenta almacenar en el búfer pero no tiene un archivo donde almacenarlo... ¿cómo puede ser más rápido?).
Mis preguntas son:
¿Cómo puedo eliminar la [advertencia] y evitar el almacenamiento en búfer de las respuestas? ¿Es mejor apagarlo
proxy_buffering
o ponerloproxy_max_temp_file_size
en 0? ¿Por qué?Si
nginx
almacena una respuesta: ¿Cuándo entrega la respuesta almacenada, a quién y por qué?¿Por qué
nginx
se activaproxy_buffering
de forma predeterminada y luego te avisa si realmente almacena una respuesta?¿Cuándo una respuesta desencadena esa opción? ¿Cuándo se necesitan > algunos segundos (¿cuántos?) para entregar la respuesta? ¿Es esto configurable?
TIA, ngw.
Respuesta1
- ¿Cómo puedo eliminar la [advertencia] y evitar el almacenamiento en búfer de las respuestas? ¿Es mejor desactivar proxy_buffering o establecer proxy_max_temp_file_size en 0? ¿Por qué?
Debes establecerlo proxy_max_temp_file_size
en 0 para eliminarlo. Elproxy_buffering
directiva no está directamente relacionada con la advertencia. Puede desactivarlo para detener cualquier almacenamiento en búfer, pero en general no se recomienda (a menos que sea necesario paraCometa).
- Si nginx almacena en buffer una respuesta, ¿cuándo entrega la respuesta almacenada en buffer, a quién y por qué?
Proporciona la respuesta 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 en búfer toda la respuesta para poder lanzar su aplicación lo antes posible.
Ver también:http://aosabook.org/en/nginx.html
- ¿Por qué nginx activa proxy_buffering de forma predeterminada y luego [advierte] si realmente almacena una respuesta en el buffer?
Como ya mencioné, proxy_buffering
no está directamente relacionado con la advertencia. Generalmente es necesario para operaciones de proxy optimizadas y desactivarlo degrada el rendimiento y la productividad.
Nginx solo le advierte cuando una respuesta no cabe en los buffers de memoria configurados. Puede ignorar la advertencia si le parece bien.
- ¿Cuándo una respuesta desencadena esa opción? ¿Cuándo se necesitan más de algunos segundos (¿cuántos?) para entregar la respuesta? ¿Es esto configurable?
Se activa cuando los buffers de memoria están llenos. Por favor, mire los documentos, se explica todo el mecanismo:http://nginx.org/r/proxy_max_temp_file_size
Es posible que desee aumentar los buffers de memoria.
Respuesta2
La siguiente configuración funciona bien en mi servidor.
proxy_buffers 16 16k;
proxy_buffer_size 16k;
Respuesta3
El comando nginx sendfile podría ayudar con esto para contenido estático
https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/
Habilitando el envío de archivos:
De forma predeterminada, NGINX maneja la transmisión de archivos por sí mismo y copia el archivo en el búfer antes de enviarlo. Habilitar la directiva sendfile elimina el paso de copiar los datos en el búfer y permite copiar datos directamente de un descriptor de archivo a otro. Para evitar que una conexión rápida ocupe por completo el proceso de trabajo, puede usar la directiva sendfile_max_chunk para limitar la cantidad de datos transferidos en una sola llamada a sendfile() (en este ejemplo, a 1 MB):
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
#...
}
Respuesta4
Agréguelos al contexto del archivo de configuración nginx.conf o del host virtual (http,servidor,ubicación):
proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;
Puede establecer los valores según su situación, pero deben tener un equilibrio entre sí (no utilice números diferentes para las directivas de búfer).
Tengo el mismo problema y pruebo estas configuraciones para un script con procesos IO, SQL y php intensos y prolongados, y funciona bien.