2016-06-19 10 views
6

मैं एक एक्सप्रेस-संचालित साइट विकसित कर रहा हूं, जो एक nginx प्रॉक्सी से गुजर रहा है। कभी-कभी जब ब्राउज़र में एक पृष्ठ लोड हो रहा है, मैं इस मिल:एक्सप्रेस और nginx net :: ERR_CONTENT_LENGTH_MISMATCH

GET http://myapp.local/css/bootstrap.css net::ERR_CONTENT_LENGTH_MISMATCH 

enter image description here

अगर मैं पेज को ताज़ा, यह आमतौर पर चला जाता है। लेकिन अगर बार-बार ताज़ा हो जाए, तो यह फिर से आएगा।

यहां समस्या क्या है? इस मुद्दे को कम करने के लिए मैं क्या कर सकता हूं?

server { 
    listen 80; 
    server_name www.myapp.local; 
    rewrite ^(.*) http://myapp.local$1 permanent; 
} 

server { 
    listen 80; 
    server_name myapp.local; 

    access_log /vagrant/nginx/logs/myapp.local/access.log; 
    error_log /vagrant/nginx/logs/myapp.local/error.log; 

    location/{ 
    proxy_pass http://localhost:8080; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection 'upgrade'; 
    proxy_set_header Host $host; 
    proxy_cache_bypass $http_upgrade; 
    } 
} 

यह निश्चित रूप से nginx प्रॉक्सी के साथ कुछ है: यहाँ इस सर्वर के लिए मेरी nginx conf है। क्योंकि अगर मैं केवल आईपी पते और नोड पोर्ट का उपयोग कर साइट तक पहुंचता हूं: http://10.10.10.10:8080 तो मुझे कभी भी त्रुटि नहीं मिलती है। लेकिन अगर मैं प्रॉक्सी किए गए vhost का उपयोग कर इसे एक्सेस करता हूं: http://myapp.local तो मुझे अंततः त्रुटि मिल जाएगी (संभवतः मुझे 10 मौकों में से 1 मौका मिलेगा)।

+0

शुरुआत के लिए मैं 'bootstrap.css' से जुड़े सभी अनुरोधों के लिए nginx लॉग ('/var/log/nginx/* ') grep grep होगा। साथ ही, यह [serverfault उत्तर] देखें (http://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom) 'वापसी' कीवर्ड का उपयोग करके एक बेहतर 'पुनर्लेखन' शैली के लिए (वह उत्तर 'https' के बारे में है, लेकिन यह यूआरएल_ से 0 www.' को हटाने के लिए भी काम करेगा। – grochmal

उत्तर

5

net::ERR_CONTENT_LENGTH_MISMATCH एक कैशिंग समस्या है। यदि आप कुछ शर्तों को पूरा करते हैं (आपके मामले में $http_upgrade) तो आप Nginx को कैश को बाईपास करने के लिए कह रहे हैं।

आपको कहीं कॉन्फ़िगरेशन फ़ाइल में nginx के लिए कैशिंग स्थान निर्दिष्ट करना चाहिए था। एक त्वरित फिक्स इस फ़ोल्डर की सामग्री को हटाने के लिए होगा, nginx को पुनरारंभ करें, और फिर साइट को फिर से एक्सेस करने का प्रयास करें। कैशिंग की कीमत पर एक और त्वरित सुधार आप अपने कैशिंग सेटअप पर अधिक जानकारी प्रदान करते हैं, तो शायद इस सवाल का जवाब सुधार किया जा सकता लाइन proxy_cache_bypass $http_upgrade;

दूर करने के लिए है।

+6

दिलचस्प धन्यवाद। मैंने यह भी पाया कि' proxy_buffering ऑफ 'भी काम करता प्रतीत होता है। धन्यवाद, –

0

जब मैंने उपर्युक्त समाधान की कोशिश की तो उसने इस मुद्दे को ठीक नहीं किया। मैंने स्थान पर लिखने की अनुमति भी बदल दी लेकिन यह काम नहीं किया। तब मुझे एहसास हुआ कि मैंने वहां कुछ गलत किया है। स्थान फ़ाइल की दुकान करने के लिए, मैं

की तरह कुछ "/ भंडारण" + fileName + ".csv"

था। मैं विंडोज वातावरण पर परीक्षण कर रहा था और यह बहुत अच्छा काम कर रहा था। लेकिन बाद में जब हमने एप्लिकेशन को लिनक्स पर्यावरण में स्थानांतरित कर दिया तो उसने काम करना बंद कर दिया। तो बाद में मैं

"./storage" करने के लिए इसे बदलना पड़ा + fileName + ".csv"

और यह सामान्य रूप से काम शुरू कर दिया।

5

यह proxy buffering के साथ एक समस्या है। जब बफरिंग सक्षम होती है, तो nginx को जल्द से जल्द प्रॉक्सी सर्वर से प्रतिक्रिया प्राप्त होती है, इसे proxy_buffer_size और proxy_buffers निर्देशों द्वारा निर्धारित बफर में सहेजती है। अगर पूरी प्रतिक्रिया स्मृति में फिट नहीं होती है, तो इसका एक हिस्सा डिस्क पर एक अस्थायी फ़ाइल में सहेजा जा सकता है। अस्थायी फ़ाइलों को लिखना proxy_max_temp_file_size और proxy_temp_file_write_size निर्देशों द्वारा नियंत्रित किया जाता है।

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

तो आप बस प्रॉक्सी बफरिंग को निष्क्रिय इस समस्या को हल करने के लिए हो सकता है:

proxy_buffering off; 

भी ध्यान रखें कि nginx बस डिस्क पर एक अस्थायी फ़ाइल के लिए लिखने की कोशिश कर रहा है और यदि डिस्क भरा हुआ है आप मिल जाएगा एक ही त्रुटि तो proxy_buffering अक्षम करने से पहले अपने डिस्क उपयोग की जांच करें।

+0

तो उत्पादन वातावरण में proxy_buffering चालू या बंद होना चाहिए? यदि स्थानीय फाइल पर्यावरण में बदलती है तो आप "प्रॉक्सी बफरिंग कैश साफ़ करें" या जिसे भी कहा जाता है? क्या मेरे पास है सेटिंग को बंद करने के लिए, nginx को पुनरारंभ करें, फिर इसे वापस बदलें और इसे पुनरारंभ करें? –

+0

'proxy_buffering off' जोड़ना; इसे मेरे लिए तय किया गया है। –

+0

ध्यान दें कि nginx बस डिस्क पर एक अस्थायी फ़ाइल को लिखने की कोशिश कर रहा है और यदि डिस्क पूरा हो गया है आपको एक ही त्रुटि मिल जाएगी। इसलिए 'proxy_b को अक्षम करने से पहले uffering' अपने डिस्क उपयोग की जांच करें। –

संबंधित मुद्दे