मैंने न्युनक्स को एक अंग-प्रत्यंग के रूप में कॉन्फ़िगर किया है, जो कि पिंकोन के तहत चल रहे पायथन एप्लिकेशन के लिए है, लेकिन लगभग 65k डेटा भेजे जाने के बाद nginx कनेक्शन समाप्त कर रहा है।
उदाहरण के लिए, मुझे एक दृश्य मिला है जो इस तरह दिखता है:
def debug_big_file(request):
return HttpResponse("x" * 500000)
लेकिन जब मैं उस URL को nginx के माध्यम से एक्सेस करता हूं, तो मुझे केवल 65283 बाइट्स मिलते हैं:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
ध्यान दें कि सब कुछ काम करता है जब सीधे gunicorn तक पहुँचने की उम्मीद की जाती है:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
प्रासंगिक nginx कॉन्फ़िगरेशन:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
और nginx संस्करण 1.7.0
कुछ अन्य तथ्य:
- बाइट्स की संख्या अनुरोध से अनुरोध के अनुरूप है, लेकिन यह सामग्री के आधार पर भिन्न होती है (मैंने पहली बार इसे बड़े पीएनजी फ़ाइल के साथ देखा था, जिसे 65,372 बाइट्स के बाद काट दिया गया था, न कि 65,283)
- 110k बाइट्स सही तरीके से भेजे जाते हैं (यानी,
"x" * 110000
सभी 110,000 बाइट्स लौटाते हैं), लेकिन 120k बाइट्स नहीं हैं tcpdump
पता चलता है कि nginx gunicorn को एक RST पैकेट भेज रहा है:
यह देखना उपयोगी होगा (क) 110 इंच से 120k बाइट्स में उत्तरों को फ्रेम करने के लिए gunicorn कैसे चुन रहा है, और (b) nginx फिर 110k और 120k बाइट्स के बीच नमूना पेलोड आकार की उसी सीमा के लिए अपना फ्रेमिंग चुनता है। HTTP को डेटा को फ़्रेम करने के तीन तरीके: सामग्री-लंबाई प्रदान कर सकते हैं; chunked एन्कोडिंग; या शरीर पूरा होने पर सॉकेट को बंद करने का वादा करने के अलावा कोई भी फ्रेमिंग नहीं देता है।
—
ब्रैंडन रोड्स
एक सामग्री-लंबाई हेडर प्रदान किया जा रहा है। मुझे देखने के लिए क्या दोनों के बीच अन्यथा हो रहा है डंप पैकेट करते हैं ...
—
डेविड Wolever
बहुत अजीब है। tcpdump सुझाव देता है कि nginx सक्रिय रूप से कनेक्शन को RST-ing कर रहा है (संपादित करें देखें)। nginx भी HTTP / 1.0 और का उपयोग कर रहा है
—
डेविड वोलेवर
Connection: close
। मैंने यह भी पुष्टि की है कि Content-Length
हेडर सही है।