सवाल nginx - क्लाइंट अनुरोध निकाय एक अस्थायी फ़ाइल में buffered है


जब भी मैं एक बड़ी फ़ाइल अपलोड करने का प्रयास करता हूं, तो मुझे अपनी लॉग फ़ाइलों में निम्न त्रुटि मिलती है।

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

हालांकि फ़ाइल सफलतापूर्वक अपलोड होती है, मुझे हमेशा उपरोक्त त्रुटि मिलती है।

मैंने बढ़ाया client_body_buffer_size सेवा मेरे 1000m जो मुझे उम्मीद है कि सबसे बड़ी फाइल अपलोड होने की उम्मीद है। हालांकि, यह सिर्फ एक अनुमान था और हालांकि मुझे अब यह त्रुटि नहीं मिली है, मैं सोच रहा हूं कि यह निर्धारित करने के लिए उचित मूल्य है या नहीं client_body_buffer_size?

अगर मैं इस निर्देश पर कुछ प्रकाश डाल सकता हूं और इसका उपयोग कैसे किया जाना चाहिए, तो मैं इसकी सराहना करता हूं।


40
2018-05-29 20:34


मूल


मैंने यह सफलतापूर्वक अपलोड नहीं किया है। - Ben


जवाब:


यह एक चेतावनी है, एक त्रुटि नहीं। यही कारण है कि यह prefaced था [warn] लॉग में

इसका मतलब है कि अपलोड की गई फ़ाइल का आकार अपलोड के लिए आरक्षित इन-मेमोरी बफर से बड़ा था।

निर्देश client_body_buffer_size उस बफर के आकार को नियंत्रित करता है।

यदि आप कभी-कभी फ़ाइल अपलोड के लिए 1 जीबी रैम आरक्षित कर सकते हैं, तो यह ठीक है। यह डिस्क पर एक अस्थायी फ़ाइल की बजाय रैम में अपलोड बफर करने के लिए एक प्रदर्शन अनुकूलन है, हालांकि इस तरह के बड़े अपलोड के साथ कुछ अतिरिक्त सेकंड शायद इससे कोई फर्क नहीं पड़ता। यदि आपके अधिकांश अपलोड छोटे हैं, तो शायद यह एक अपशिष्ट है।

अंत में, केवल आप ही निर्णय ले सकते हैं कि उचित आकार क्या है।


39
2018-05-29 20:39



आपके उत्तर ने मुझे निर्णय लेने में मदद की है। मैं मान को 512k से 1 मीटर तक कम कर दूंगा। यह एक शर्म की बात है कि मुझे इनमें से बहुत सी चेतावनियां मिलेंगी। - Abs
वजह से अप्रत्यक्ष स्मृति, एक बड़े मूल्य का उपयोग करने से "कभी-कभी फ़ाइल अपलोड के लिए आरक्षित 1 जीबी रैम" नहीं होगा। (वर्तमान अपलोड के लिए वास्तव में इसकी आवश्यकता से अधिक रैम का उपयोग नहीं किया जाएगा।) - Kirill Bulygin
अगर मैं इसे 50 एमबी पर सेट करता हूं और 200 लोग एक ही पल में एक पेज देखते हैं, तो क्या यह 10 जीबी मेमोरी लेगा, या क्या 50 एमबी केवल फाइल अपलोड करने वाले किसी भी उपयोगकर्ता के लिए आवंटित किया जाएगा? - Codemonkey
@Codemonkey यह बफर केवल तभी उपयोग किया जाता है जब अनुरोध निकाय अपलोड किया जा रहा हो। एक बार अपलोड पूरा हो जाने पर स्मृति किसी अन्य अनुरोध के लिए उपयोग करने के लिए स्वतंत्र है। और जैसा कि अन्य टिप्पणीकार ने बताया, जबकि एक अपलोड प्रगति पर नहीं है, कोई स्मृति का उपयोग नहीं किया जाता है। तो यह इस बात पर निर्भर करता है कि आप किसी भी तत्काल तत्काल अपलोड पर कितने अपलोड कर रहे हैं। - Michael Hampton♦
अक्सर दस, शायद 20 से अधिक नहीं 128 जीबी बॉक्स तो मेरे पास बहुत मेमोरी है ..! ईमानदारी से हालांकि, मैं इसे अपने त्रुटि लॉग में उन [चेतावनी] लाइनों से छुटकारा पाने के लिए कर रहा हूं - मुझे शायद उन्हें अनदेखा करना चाहिए! - Codemonkey


यदि आप NginX को अस्थायी फ़ाइल में बॉडी सामग्री को स्टोर नहीं करना चाहते हैं, तो आप अपनी कॉन्फ़िगरेशन सेट कर सकते हैं। इस तरह:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

यदि आप दोनों कॉन्फ़िगरेशन को एक ही अधिकतम पर सेट करते हैं। आकार (के, एम या जी के क्रमशः केबी, एमबी या जीबी के लिए), आप रोक देंगे कि NginX एक अस्थायी बनाता है। फ़ाइल।

अधिक जानकारी के लिए: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size तथा http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size


13
2017-11-04 02:35



लेकिन उस कॉन्फ़िगरेशन के साथ आप 10 एमआईबी से बड़े सभी अपलोड को भी रोक देंगे - Josef
@ जोसेफ: नहीं रोकना किसी भी तरह से। यह सिर्फ इतना है कि अनुरोध को डिस्क पर बफर करने की आवश्यकता होगी, और आपको चेतावनी मिलेगी। स्वीकृत उत्तर की जांच करें। - OmarOthman
@OmarOthman, जोसेफ सही है क्योंकि client_max_body_size पैरामीटर। इस लिंक पर जानकारी देखें: client_max_body_size दस्तावेज़।: 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