nginx - o corpo da solicitação do cliente é armazenado em buffer em um arquivo temporário


49

Eu recebo o seguinte erro nos meus arquivos de log sempre que tento carregar um arquivo grande.

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

Embora o arquivo seja carregado com êxito, sempre recebo o erro acima.

Aumentei o valor client_body_buffer_sizepara o 1000mqual eu espero que o maior arquivo carregado seja. No entanto, isso foi apenas um palpite e, embora eu não receba mais esse erro, pergunto-me se esse é um valor apropriado para o client_body_buffer_size?

Eu apreciaria se alguém pudesse lançar alguma luz sobre essa diretiva e como ela deve ser usada.


2
Eu tenho isso não foi enviado com sucesso.
— Ben

Respostas:


51

Este é um aviso, não um erro. É por isso que foi precedido [warn]no log.

Isso significa que o tamanho do arquivo carregado foi maior que o buffer da memória reservado para uploads.

A diretiva client_body_buffer_sizecontrola o tamanho desse buffer.

Se você pode ter 1 GB de RAM sempre reservado para o upload ocasional de arquivos, tudo bem. É uma otimização de desempenho para armazenar em buffer o upload na RAM em vez de em um arquivo temporário no disco, embora com envios tão grandes alguns segundos extras provavelmente não importem muito. Se a maioria dos seus envios for pequena, provavelmente será um desperdício.

No final, somente você pode realmente tomar a decisão sobre qual é o tamanho apropriado.


5
Sua resposta me ajudou a tomar uma decisão. Vou diminuir o valor para cerca de 512k a 1m. É uma pena que recebo muitos desses avisos.
— Abs

Por causa da memória virtual , o uso de um valor alto não levará a "1 GB de RAM sempre reservado para o upload ocasional de arquivos". (Não mais RAM do que é realmente necessário para o upload atual será usado.)
— Kirill Bulygin

1
Se eu definisse isso para 50 MB e 200 pessoas visualizassem uma página no mesmo instante, isso consumiria 10 GB de memória ou os 50 MB seriam alocados apenas para usuários que executam um upload de arquivo?
— Codemonkey

@Codemonkey Esse buffer é usado apenas enquanto um corpo de solicitação está sendo carregado. Depois que o upload é concluído, a memória fica livre para ser usada para outra solicitação. E, como o outro comentarista apontou, enquanto um upload não está em andamento, nenhuma memória é usada. Portanto, depende de quantos uploads simultâneos você realiza em um determinado instante.
— Michael Hampton

Muitas vezes, dez, provavelmente nunca mais do que 20. Caixa de 128GB, por isso tenho bastante memória ..! Honestamente, eu faria isso apenas para me livrar dessas linhas [alert] no meu log de erros - eu provavelmente deveria ignorá-las!
— Codemonkey

18

Se você não deseja que o NginX armazene o conteúdo do corpo em um arquivo temporário, é possível definir sua configuração. como isso:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Se você definir essas duas configurações no mesmo valor máx. tamanho (em k, M ou G para kB, MB ou GB, respectivamente), você evitará que o NginX crie uma temperatura. Arquivo.

Para obter mais informações: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size e http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size


8
Mas com essa configuração, você também impedirá todos os envios maiores que 10 MiB.
— Josef

@ Josef: Não impedir por qualquer meio. É só que a solicitação precisará ser armazenada em buffer no disco e você receberá o aviso. Verifique a resposta aceita.
— OmarOthman

9
@OmarOthman, Josef está certo por causa do client_max_body_sizeparâmetro. Veja as informações neste link: 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.