nginx - müşteri istek gövdesi geçici bir dosyaya tamponlanıyor


48

Büyük dosyaları yüklemeyi her denediğimde günlük dosyalarımda aşağıdaki hatayı alıyorum.

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

Dosya başarıyla yüklenmesine rağmen, her zaman yukarıdaki hatayı alıyorum.

Ben arttı client_body_buffer_sizeetmek 1000mOlmak yüklenen büyük dosya beklediğiniz olduğu. Ancak, bu sadece bir tahmindi ve artık bu hatayı alamadım, ancak bunun için ayarlamak için uygun bir değer olup olmadığını merak ediyorum client_body_buffer_size?

Biri bu yönergeye biraz ışık tutabilir ve nasıl kullanılması gerektiği için minnettar olurum.


2
Bu başarılı bir şekilde yüklenmedi.
Ben

Yanıtlar:


51

Bu bir uyarıdır, bir hata değildir. Bu yüzden kütükte ön plana [warn]çıkmıştı.

Bu, yüklenen dosyanın boyutunun, yüklemeler için ayrılan bellek içi arabellekten daha büyük olduğu anlamına gelir.

Yönerge client_body_buffer_sizebu tamponun boyutunu kontrol eder.

Zaman zaman dosya yüklemesi için her zaman 1 GB RAM'e sahip olmanız gerekiyorsa, sorun değil. Yüklemenin diskteki geçici bir dosya yerine RAM'deki ara belleğe alınması performans optimizasyonu olsa da, bu tür büyük yüklemelerde birkaç saniye daha fazla önemli değil. Yüklemelerin çoğu küçükse, muhtemelen bir israf.

Sonunda, yalnızca uygun boyutun ne olduğu konusunda gerçekten karar verebilirsiniz.


5
Cevabınız karar vermeme yardımcı oldu. Değeri yaklaşık 512k ila 1m'ye düşüreceğim. Çok yazık, bu uyarıların çoğunu alacağım.
Abs

Sanal bellek nedeniyle, büyük bir değer kullanmak, "her zaman ara sıra dosya yükleme için her zaman 1 GB RAM ayrılmış" anlamına gelmez. (Geçerli yükleme için gerçekte gerekenden daha fazla RAM kullanılmayacak.)
Kirill Bulygin

1
Bunu 50 MB olarak ayarladıysam ve 200 kişinin aynı anda bir sayfayı görüntülemesini sağlasaydım, bu 10GB'lık bir hafıza kapar mıydı yoksa 50MB sadece dosya yükleme yapan herhangi bir kullanıcı için tahsis edilebilir mi?
Codemonkey

@Codemonkey Bu arabellek yalnızca bir istek gövdesi yüklenirken kullanılır. Yükleme tamamlandıktan sonra, hafıza başka bir istek için kullanılmak üzere serbesttir. Diğer yorumcunun da belirttiği gibi, yükleme devam ederken hiçbir hafıza kullanılmıyor. Bu, herhangi bir anda kaç eşzamanlı yükleme yaptığınıza bağlıdır.
Michael Hampton,

Genellikle on, muhtemelen asla 20'den fazla olmaz. 128GB'lık kutu bu yüzden bol miktarda belleğim var ..! Açıkçası, hata günlüğümdeki bu [uyar] satırlardan kurtulmak için yapıyordum - muhtemelen onları görmezden gelmeliyim!
Codemonkey

17

NginX'in gövde içeriğini geçici bir dosyada saklamak istemiyorsanız, config ayarlarınızı yapabilirsiniz. bunun gibi, böyle:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Bu konfigürasyonların her ikisini de aynı maks. boyut (sırasıyla kB, MB veya GB için k, M veya G cinsinden), NginX'in geçici bir sıcaklık oluşturmasını önleyeceksiniz. dosya.

Daha fazla bilgi için: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size ve http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_siz_body_siz


8
Ama bu yapılandırma ile de daha büyük 10 MiB olan tüm yüklemeleri önleyecektir
Josef

@Josef: Hiçbir şekilde engellemez . Sadece isteğin diske tamponlanması gerekecek ve uyarı alacaksın. Kabul edilen cevabı kontrol et.
OmarOthman

9
@OmarOthman, Josef client_max_body_sizeparametre nedeniyle haklı . Bu bağlantıdaki bilgiye bakınız: 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.