nginx: el cuerpo de la solicitud del cliente se almacena en un archivo temporal

49

Recibo el siguiente error en mis archivos de registro cada vez que intento cargar un archivo grande.

a client request body is buffered to a temporary file /var/lib/nginx/body/0000000001

Aunque el archivo se carga correctamente, siempre recibo el error anterior.

Aumenté la client_body_buffer_sizede 1000mque es lo que espero que el archivo más grande subido ser. Sin embargo, esto es solo una suposición y, aunque ya no obtengo ese error, me pregunto si este es un valor apropiado para establecer client_body_buffer_size.

Le agradecería si alguien puede arrojar algo de luz sobre esta directiva y cómo se debe utilizar.

Abdominales
fuente
2
Tengo esto no se ha cargado correctamente.
Ben

Respuestas:

51

Esta es una advertencia, no un error. Es por eso que fue precedido [warn]en el registro.

Significa que el tamaño del archivo cargado era mayor que el búfer en memoria reservado para las cargas.

La directiva client_body_buffer_sizecontrola el tamaño de ese búfer.

Si puede permitirse tener 1GB de RAM siempre reservado para la carga ocasional de archivos, entonces está bien. Es una optimización del rendimiento para almacenar la carga en RAM en lugar de en un archivo temporal en el disco, aunque con cargas tan grandes, un par de segundos adicionales probablemente no importen demasiado. Si la mayoría de sus cargas son pequeñas, entonces probablemente sea un desperdicio.

Al final, solo usted realmente puede tomar la decisión de cuál es el tamaño apropiado.

Michael Hampton
fuente
55
Tu respuesta me ha ayudado a tomar una decisión. Reduciré el valor a aproximadamente 512k a 1m. Es una pena que reciba muchas de estas advertencias.
Abs
Debido a la memoria virtual , el uso de un valor grande no generará "1 GB de RAM siempre reservada para la carga ocasional de archivos". (No se usará más RAM de la que realmente se necesita para la carga actual.)
Kirill Bulygin
1
Si configuré esto en 50 MB y 200 personas vieron una página en el mismo instante, ¿eso ocuparía 10 GB de memoria o los 50 MB solo se asignarían a los usuarios que realicen una carga de archivos?
Codemonkey
@Codemonkey Este búfer solo se usa mientras se carga un cuerpo de solicitud. Una vez que se completa la carga, la memoria se puede usar libremente para otra solicitud. Y como señaló el otro comentarista, mientras una carga no está en progreso, no se usa memoria. Por lo tanto, depende de cuántas cargas simultáneas tenga en un instante dado.
Michael Hampton
A menudo diez, probablemente nunca más de 20. ¡Caja de 128GB así que tengo mucha memoria ..! Honestamente, sin embargo, lo estaría haciendo para deshacerme de esas líneas [advertir] en mi registro de errores, ¡probablemente debería ignorarlas!
Codemonkey
18

Si no desea que NginX almacene el contenido del cuerpo en un archivo temporal, puede configurar su configuración. Me gusta esto:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Si establece ambas configuraciones al mismo máximo. tamaño (en k, M o G para kB, MB o GB, respectivamente), evitará que NginX cree una temperatura. archivo.

Para más información: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size y http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

eddy85br
fuente
8
Pero con esa configuración también evitará todas las cargas que sean más grandes que 10 MiB
Josef
@Josef: No evitar de ninguna manera. Es solo que la solicitud deberá almacenarse en el disco, y recibirá la advertencia. Verifique la respuesta aceptada.
OmarOthman
99
@OmarOthman, Josef tiene razón debido al client_max_body_sizeparámetro. Vea la información en este enlace: client_max_body_size doc. : Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.
eddy85br