नगीनक्स 65k बाइट्स के बाद कनेक्शन समाप्त करता है


11

मैंने न्युनक्स को एक अंग-प्रत्यंग के रूप में कॉन्फ़िगर किया है, जो कि पिंकोन के तहत चल रहे पायथन एप्लिकेशन के लिए है, लेकिन लगभग 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हेडर सही है।
डेविड वोलेवर

जवाबों:


10

ठीक है! नगीनक्स लॉग की दोहरी जाँच के बाद, यह समस्या बन गई:

2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", host: "example.com"

proxy_tempडायरेक्टरी के लिए कुछ अनुमतियाँ गड़बड़ हो गईं, जो नेगनेक्स को ठीक से बफ़र करने से रोकती थीं।


1
हाँ, मैंने अभी इस तरह से एक समस्या को हल किया, नगीनक्स लॉग्स में देखा, एक लाइन युक्त [crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstreamथा, किया sudo chown -R www-data:www-data /var/lib/nginx/और यह ठीक हो गया।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.