nginx अपलोड client_max_body_size समस्या


117

मैं nginx / रूबी-ऑन-रेल चला रहा हूं और मेरे पास फ़ाइलों को अपलोड करने के लिए एक सरल मल्टीपार्ट फॉर्म है। जब तक मैं अपलोड की जाने वाली फ़ाइलों के अधिकतम आकार को प्रतिबंधित करने का निर्णय नहीं लेता, तब तक सब कुछ ठीक रहता है। ऐसा करने के लिए, मैंने nginx client_max_body_sizeको 1m (1MB) पर सेट किया और उस नियम के टूटने पर प्रतिक्रिया में HTTP 413 (रिक्वेस्ट एंटिटी टू लार्ज) की स्थिति की अपेक्षा की।

समस्या यह है कि जब मैं 1.2 एमबी फ़ाइल अपलोड करता हूं, तो HTTP 413 त्रुटि पृष्ठ प्रदर्शित करने के बजाय, ब्राउज़र थोड़ा लटका रहता है और फिर "कनेक्शन रीसेट होने के दौरान मर जाता है जब पृष्ठ लोड हो रहा था" संदेश।

मैंने बस हर विकल्प के बारे में कोशिश की है कि nginx ऑफ़र है, कुछ भी काम नहीं करता है। क्या किसी को इस बारे में कोई विचार है?

यहाँ मेरा nginx.conf है:

worker_processes  1;
timer_resolution  1000ms;
events {
    worker_connections  1024;
}

http {
    passenger_root /the_passenger_root;
    passenger_ruby /the_ruby;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile           on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name www.x.com;
      client_max_body_size 1M;
      passenger_use_global_queue on;
      root /the_root;
      passenger_enabled on;

      error_page 404 /404.html;
      error_page 413 /413.html;    
    }    
}

धन्यवाद।


**Edit**

पर्यावरण / यूए: विंडोज एक्सपी / फ़ायरफ़ॉक्स 3.6.13

जवाबों:


128

जब ग्राहक इसे client_max_body_size413 प्रतिक्रिया भेजकर और कनेक्शन बंद करके बड़ा बॉडी भेजने जा रहा है, तो nginx "तेजी से विफल" होता है ।

अधिकांश ग्राहक प्रतिक्रियाएँ तब तक नहीं पढ़ते हैं जब तक कि संपूर्ण अनुरोध निकाय नहीं भेज दिया जाता है। क्योंकि nginx कनेक्शन बंद कर देता है, क्लाइंट बंद सॉकेट में डेटा भेजता है, जिससे एक टीसीपी RST होता है।

यदि आपका HTTP क्लाइंट इसका समर्थन करता है, तो इसे संभालने का सबसे अच्छा तरीका है Expect: 100-Continueहेडर भेजना । Nginx सही ढंग से 1.2.7 के रूप में इस का समर्थन करता है, और एक साथ जवाब देगा 413 Request Entity Too Largeप्रतिक्रिया के बजाय 100 Continueअगर Content-Lengthअधिकतम शरीर के आकार से अधिक है।


1
ओह, मुझे यह कहना चाहिए कि यह उत्तर मानता है कि ग्राहक Content-Lengthकरने के बजाय भेज रहा है Transfer-Encoding: chunked
जो शॉ

2
Nginx लेखक ने मेलिंग सूची पर इसे ठीक करने के लिए एक पैच पोस्ट किया: nginx.2469901.n2.nabble.com/ ... कोई शब्द नहीं है कि क्या इसे 1.2.x स्थिर शाखा में जोड़ा जाएगा, हालांकि।
जो शॉ

धन्यवाद, जो वास्तव में बहुत कुछ समझाता है। निश्चित रूप से ऐसा लगता Expectहै कि बड़े अनुरोधों के लिए रास्ता है।
क्रुकेड

ध्यान दें कि मेरे द्वारा पहले उल्लेख किया गया पैच 1.2.7 रिलीज में प्रतिबद्ध और शामिल था।
जो शॉ

बस एक अच्छा वाक्यविन्यास की तलाश में समय बचाने के लिए (जैसे मैंने खर्च किया): के request.setHeader(HttpHeaders.EXPECT, CONTINUE);साथ import org.apache.http.HttpHeaders;औरimport static org.jboss.netty.handler.codec.http.HttpHeaders.Values.CONTINUE;
इरेज़ कोहेन

48

क्या आपका अपलोड बहुत अंत में मर जाता है? दुर्घटनाग्रस्त होने से पहले 99%? क्लाइंट बॉडी और बफ़र्स महत्वपूर्ण हैं क्योंकि nginx को आने वाले डेटा को बफर करना चाहिए। बॉडी कॉन्फिगरेशन (रिक्वेस्ट बॉडी का डेटा) निर्दिष्ट करता है कि कैसे nginx मल्टी-पार्ट-फॉर्म क्लाइंट से बाइनरी डेटा के बल्क फ्लो को आपके ऐप के लॉजिक में हैंडल करता है।

cleanको निर्देश nginx द्वारा स्मृति और खपत सीमा सेटिंग मुक्त करता है एक फ़ाइल में भेजे बफर स्टोर करने के लिए और फिर इसे हटाने के द्वारा डिस्क से इस फ़ाइल को बाद साफ।

सेट body_in_file_onlyकरने के लिए cleanऔर के लिए बफ़र्स समायोजित client_max_body_size। मूल प्रश्न के कॉन्फिग में पहले से ही सेंडफाइल था, टाइमआउट भी बढ़ाएं। मैं इसे ठीक करने के लिए नीचे की सेटिंग्स का उपयोग करता हूं, जो आपके स्थानीय कॉन्फ़िगरेशन, सर्वर, और http संदर्भों में उपयुक्त है।

client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;

यहां तक ​​कि अगर इसका परिणाम नगण् य HTTP 413 को वापस करने में होता है, तब भी UA अनुरोध निकाय की संपूर्णता भेजना समाप्त कर देगा, है न? उस स्थिति में मुझे लगता है कि यह दृष्टिकोण की कोशिश करने लायक है @ जो-शॉ का सुझाव दिया गया।
krukid

@krukid जब ऐसा लगता है कि हमें NGINX के पहले 99% अपलोड पूरा हो गया है "तेजी से विफल," मैं आपसे सहमत हूँ। इस मामले में, सभी संकेत अनुरोध ऑब्जेक्ट के आसपास सकारात्मक हैं, अर्थात निदान यह है कि आंतरिक सर्वर अनुप्रयोग तर्क ठीक है - जो भी नग्नेक्स के पीछे चलता है। इसलिए जब यह संभावना है कि अनुरोध अच्छी तरह से बन गया है, तो हमारी जरूरत इस बात पर विचार करने की है कि एनजीआईएनएक्स प्रतिक्रिया पर क्यों विचार करे। client_max_body_size पहला कॉन्फिगर विकल्प होना चाहिए जिसे हम देखते हैं, फिर बफ़र्स पर विचार करें, क्योंकि एक बड़े पर्याप्त अपलोड के साथ सही समाधान इस बात पर निर्भर करता है कि हमारा सर्वर कितनी मेमोरी को हैंडल कर सकता है।
बेंट कार्डन

@ बेंट कार्डन। यह दृष्टिकोण बेहतर लग रहा था और मैंने इसे आजमाया। लेकिन मैं अभी भी 4mb फ़ाइल के लिए लगभग 20 सेकंड के बाद 413 त्रुटि प्राप्त कर रहा हूं। मेरे upspeeds 20secs में 4 एमबी का प्रबंधन नहीं कर सकते हैं इसलिए ऐसा हो रहा है जब डेटा काफी हद तक बह रहा है। विचार?
जेरोम

मैंने nginx.conf फ़ाइल में परिवर्तन जोड़े हैं _client_max_body_size 300M; sendfile on; send_timeout 300s; _ इसके लिए पूरी तरह से मेरे लिए काम कर रहा है धन्यवाद
रमेश चंद

समाधान मेरे लिए काम करता है openshift php7 nginx
Marlo

7

से प्रलेखन :

यह ध्यान रखना आवश्यक है कि ब्राउज़र यह नहीं जानते कि इस त्रुटि को सही ढंग से कैसे दिखाया जाए।

मुझे संदेह है कि यह क्या हो रहा है, अगर आप फायरबग या लाइव एचटीटीपी हेडर (फ़ायरफ़ॉक्स एक्सटेंशन दोनों) जैसे टूल का उपयोग करके HTTP टू-एंड-फ्रेल का निरीक्षण करते हैं, तो आप देख पाएंगे कि वास्तव में क्या चल रहा है।


1
मैं यहाँ भी आ गया हूँ, यहाँ तक कि: forum.nginx.org/read.php?2,2620 जहाँ nginx लेखक का कहना है कि लोग lingering_time / lingering_timeout को बदलने की कोशिश कर सकते हैं - दोनों का मेरे मामले में कोई प्रभाव नहीं था। इसके अलावा, मैं अभी यह नहीं देखता कि जब मैं एक स्थिर 5Mbps कनेक्शन आसानी से 1MB की सीमा के साथ 1.2MB फ़ाइल अपलोड कर रहा हूं तो लगातार टाइमआउट समस्या कैसे हो सकती है। मैंने प्रतिक्रिया सूँघ ली है और यह 413 पेज को "कनेक्शन: क्लोज़" हेडर के साथ भेजता है, लेकिन कनेक्शन बंद नहीं होता है।
krukid

मुझे लगता है कि मेरे पास सिर्फ यह मानने में कठिन समय है कि भले ही 413 HTTP स्थिति पूरी तरह से वैध है, लेकिन यह ब्राउज़रों में आग नहीं लगाता है। मैंने बहुत सी ऐसी जगहों पर जाना है जहाँ लोग उस पेज से छुटकारा नहीं पा सकते हैं, और मैंने इसे कभी देखा भी नहीं है।
krukid

यदि आप यात्री को अक्षम करते हैं, तो क्या यह कनेक्शन बंद कर देता है?
मार्क रोज़

खैर, मैंने यात्रियों के साथ और बिना प्रतिक्रियाओं की तुलना की। जब सब कुछ सामान्य रूप से चलता है और मैं अपने 1 एमबी प्रतिबंध से कई गुना बड़ा (~ 14 एमबी) फ़ाइल अपलोड करता हूं तो मुझे कई बार 413 प्रतिक्रिया मिलती है (क्योंकि क्लाइंट चंक्स भेजता रहता है) और अंतिम "कनेक्शन रीसेट" एक टाइमआउट की तरह दिखता है। यात्री के बिना मुझे एक 413 त्वरित प्रतिक्रिया मिलती है और सभी प्रगति रुक ​​जाती है, लेकिन मुझे अभी भी "कनेक्शन रीसेट" पृष्ठ दिखाई देता है, न कि मेरा स्टेटिक 413.html या "एंटिटी टू लार्ज"
जैसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.