Nginx chunked सामग्री के लिए सामग्री-लंबाई शीर्षलेख निकालता है


10

मैं स्क्रिप्ट के लिए प्रॉक्सी से nginx 1.2.3 का उपयोग करता हूं:

proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8880;
proxy_buffering off;
proxy_read_timeout 300s;
gzip off;

स्क्रिप्ट दोनों भेजता है Transfer-encoding: chunkedऔर Content-Length: 251:

HTTP/1.0 307 Temporary Redirect
Content-length: 251
Pragma: no-cache
Location: /...
Cache-control: no-cache
Transfer-encoding: chunked

मुझे दोनों की आवश्यकता है, लेकिन nginx स्वचालित रूप से हटा देता है Content-Length:

HTTP/1.1 302 Found
Server: nginx/1.2.3
Content-Type: application/json; charset=utf-8
Content-Length: 58
Connection: keep-alive
Location: /...

परिणामस्वरूप, ग्राहक भेजे जाने के लिए इंतजार नहीं करते हैं। यह nginx के पुराने संस्करण के साथ काम करता था।


हेडगेन्स नगनेक्स प्रॉक्सी से क्या दिखते हैं?
hrunting

यह किस संस्करण के साथ काम करता था?
CNST

यह नगीनेक्स 0.9.8 के साथ काम करता था
जुलिएन

आप HTTP प्रोटोकॉल का उल्लंघन कर रहे हैं। यह nginx 0.9.8 के साथ काम करता है, क्योंकि 1.1.4 संस्करण तक यह सभी पर chunked एन्कोडिंग का समर्थन नहीं करता है।
22

जवाबों:


11

दुर्भाग्य से, मैं cnst की पोस्ट पर टिप्पणी नहीं कर सकता - इसलिए मैं यहां जवाब देने जा रहा हूं।

nginx_http_proxyHTTP / 1.0 में नदी के ऊपर के साथ डिफ़ॉल्ट वार्ता से मॉड्यूल। इसे निर्देश के साथ बदला जा सकता है proxy_http_version 1.1

यह आपकी स्क्रिप्ट के HTTP / 1.0 उत्तर को वापस करने का कारण भी हो सकता है, हालाँकि 307इस संस्करण में chunked कोडिंग और स्थिति कोड मौजूद नहीं है।

आपको किसी अनुप्रेषित कोडिंग के साथ किसी भी तरह से चिपके हुए कोडिंग का उपयोग नहीं करना चाहिए , क्योंकि यह वास्तव में समझ में नहीं आता है।

इसके अतिरिक्त , ऐसा लगता है कि नग्नेक्स ऊपर की ओर से क्लाइंट को एक-एक करके चोक नहीं करता है , लेकिन यह अपस्ट्रीम की प्रतिक्रिया को बफ़र करता हैContent-Lengthशीर्ष लेख क्षेत्र पर ध्यान नहीं दिया, क्योंकि यह परिभाषा के खिलाफ है। मुझे मॉड्यूल के स्रोत कोड को देखना था क्योंकि यह सब अनैजंटेड प्रतीत होता है।

आप nginx_tcp_proxy_moduleकच्चे टीसीपी डेटा के रूप में chunked सामग्री को प्रॉक्सी करने की कोशिश करना चाह सकते हैं : Github पर मॉड्यूल


अद्यतन (10.04.14) मॉड्यूल के लिए समर्थन हासिल है हेडर , जिनमें से एक ( ) नियंत्रण प्रतिक्रिया या बफ़र जाना चाहिए कि क्या नहीं।
nginx_http_proxyX-Accel-* X-Accel-Buffering: yes|no

इस हेडर ( X-Accel-Buffering: no) को बैकएंड की प्रतिक्रिया में जोड़ने से क्लाइंट को सीधे पास करने के लिए nginx का कारण होगा।

यह शीर्ष लेख प्रति-अनुरोध के आधार पर बफरिंग को नियंत्रित करने की अनुमति देता है ।

प्रतिक्रिया बफ़रिंग को सक्षम या अक्षम करने के लिए मॉड्यूल का कॉन्फ़िगरेशन निर्देश भी होता है proxy_buffering(बफ़रिंग का अर्थ यह नहीं है कि चंक्स भेजना काम करेगा)।

प्रॉक्सी बफ़रिंग (हेडर और निर्देश आधारित दोनों) यहाँ प्रलेखित है


उसके साथ भी ऐसा नहीं करना चाहिए nginx_tcp_proxy_module। यह केवल कुछ ब्राउज़रों के साथ काम करता है क्योंकि वे बहुत त्रुटि सहिष्णु हैं।
22

क्योंकि यह सब अविवादित गलत प्रतीत होता है । यह आरएफसी 2616. देखें में दर्ज है 13.5.1
VBart

@VBart निश्चित रूप से मानक हैं - लेकिन उनके बारे में बहुत कम जानकारी है कि विशेष रूप से nginx उन्हें कितनी दूर तक लागू करता है। TCP प्रॉक्सी मॉड्यूल एक सुझाए गए समाधान का संकेत है ।
लुकास

9

जैसा कि लुकास ने कहा, Content-Lengthअगर कोई Transfer-Encodingसेट है तो HTTP 1.1 निषिद्ध है ।

Http://www.ietf.org/rfc/rfc2616.txt का हवाला देते हुए :

   3.If a Content-Length header field (section 14.13) is present, its
     decimal value in OCTETs represents both the entity-length and the
     transfer-length. The Content-Length header field MUST NOT be sent
     if these two lengths are different (i.e., if a Transfer-Encoding
     header field is present). If a message is received with both a
     Transfer-Encoding header field and a Content-Length header field,
     the latter MUST be ignored.

इसके अतिरिक्त, HTTP 1.1 के अनुपालन में Nginx का सही व्यवहार HTTP अनुरोध तस्करी के हमलों को रोकने की दिशा में एक लंबा रास्ता तय करता है।
amn

3

आपने विशेष रूप से विस्तृत नहीं किया है कि आपकी स्क्रिप्ट को पहली जगह में विशेष रूप से पुनर्निर्देशित प्रतिक्रिया के साथ chunked एन्कोडिंग की आवश्यकता क्यों है।

मैं यहां समस्याओं की एक भीड़ देखता हूं।

  • Transfer-Encoding: chunkedएक HTTP/1.1विशेषता है (और आपकी स्क्रिप्ट HTTP/1.0हेडर के साथ उत्तर दे रही है )

  • में नहीं 307हैHTTP/1.0

  • इसका पूरा उद्देश्य chunkedयह है कि आप नहीं जानते कि आपका Content-Lengthक्या होना चाहिए, इसलिए, chunkedइसका उपयोग लंबाई प्रदान करने के स्थान पर किया जाता है Content-Length, जहां इसके बजाय प्रतिक्रिया के शरीर के भीतर लंबाई प्रदान की जाती है, वास्तविक सामग्री के साथ अंतःक्षिप्त; यह एक स्क्रिप्ट के लिए व्यर्थ होगा जो दोनों हेडर को आगे बढ़ाती है

मैं के साथ व्यक्तिगत रूप से परिचित नहीं हूँ chunked, लेकिन जैसा कि बुनियादी जानकारी प्रति http://en.wikipedia.org/wiki/Chunked_transfer_encoding और भी http://tools.ietf.org/html/rfc2616#section-3.6.1 , मैं इस बात का अनुमान लगाऊंगा कि आपके स्क्रिप्ट की पूरी तरह से संकलित एन्कोडिंग पूरी तरह से गलत हो सकती है।

यदि उपरोक्त अभी भी इसे कवर नहीं करता है, और सभी वास्तविकता में अन्यथा, यह भी स्पष्ट नहीं है कि "अजीब" एन्कोडिंग के साथ 307या 302http स्थिति कोड के साथ उत्तर क्यों प्रदान किया जाना चाहिए। हाल ही में nginx मेलिंग सूची में एक समान चर्चा के बारे में 410 Goneऔर अन्य त्रुटि पृष्ठों को हमेशा gzipसंपीड़न से बाहर रखा गया था , और मुझे लगता है कि भावना समान रूप से यहां लागू होगी। ( http://mailman.nginx.org/pipermail/nginx/2013-March/037890.html )


मैं इसका उपयोग उपयोगकर्ता को प्रतीक्षा करने के लिए करता हूं: मैं प्रत्येक सेकंड में चंक्स भेजता हूं, ताकि उपयोगकर्ता बिना टाइमआउट के एक्स सेकंड के लिए पुनर्निर्देशन की प्रतीक्षा करेगा
जुलिएन

मैं पहली बार ठीक HTTP / 1.0 HTTP / 1.1 करने के लिए करने की सलाह चाहते हैं (ये बातें करना एक फर्क), और सुनिश्चित करें कि आपके chunked एन्कोडिंग अनुचित नहीं है। नगनेक्स का नया संस्करण शायद कुछ हेडर को छोड़ देता है, जिस पर आप निर्भर करते हैं क्योंकि वे गलत हैं।
7'13

1

मुझे html5 वीडियो टैग के माध्यम से mp4 फ़ाइल को स्ट्रीमिंग करने का एक ही मुद्दा था।

सफ़ारी और फ़ायरफ़ॉक्स ने सामान्य रूप से व्यवहार किया जबकि क्रोम कुछ बिंदु पर ERR_CONTENT_LENGTH_MISMATCH को ट्रिगर कर रहा था (लेकिन इसने मुझे असफल होने से पहले वीडियो के कई मिनट बर्बाद करने की अनुमति दी)।

Mp4 फ़ाइलों के लिए कैश नियंत्रण बंद करने के बाद समस्या पुन: उत्पन्न नहीं हुई।


0

इस उत्तर को साझा करते हुए मैंने एसओ को पोस्ट किया, यदि यह उपयोगी है: /programming/50499637/mp4-video-safari-cloudflare-nginx-rails-no-play/59/8509850

मेरे पास mp4 प्लेबैक के साथ एक समान मुद्दा था क्योंकि चंक्स की सेवा नहीं की जा रही थी, और नीचे सूचीबद्ध Apple के गाइड के प्रति इस मुद्दे की पुष्टि की। मैंने सत्यापित किया कि मैं पूरी फ़ाइल डाउनलोड कर रहा था, और नीचे ठीक होने के बाद, केवल पहला हिस्सा।

curl --range 0-99 http://example.com/test.mov -o /dev/null

मैंने अपने nmpx.conf में अपनी gzip कम्प्रेशन सेटिंग को बदलकर .mp4 फ़ाइलों की gipip कम्प्रेशन को हटाने के लिए अपने Safari .mp4 प्लेबैक को हल किया ।

यहाँ संदर्भ के लिए nginx में ब्लॉक है। (नोट: आपका ऐप कैसे कॉन्फ़िगर किया गया है, इसके आधार पर, आपको स्थान रेखा को बदलने की आवश्यकता हो सकती हैlocation ~ \.mp4$ {

location ~ ^/(assets|system|videos)/  {
   expires max;
   add_header Cache-Control public;
   add_header ETag "";
   gzip on;
   gzip_http_version 1.1;
   gzip_vary on;
   gzip_comp_level 6;
   gzip_proxied any;

   # Reference configuration
   #gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript video/mp4 application/mp4 image/jpeg image/png image/svg+xml application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;

   # Kelton trying to fix cloudflare by removing the mp4 settings
   gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript image/jpeg image/png image/svg+xml application/application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;
}

Apple दस्तावेज़ीकरण संदर्भ से लिंक करें: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone.CreatingVideoforSafarioniPhone.html#//lele_ref/doc/TP/TP

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.