मैं FastCGI का उपयोग कर nginx के पीछे Django चला रहा हूं। मुझे पता चला है कि क्लाइंट को भेजे गए कुछ जवाबों में प्रतिक्रियाओं के बीच में यादृच्छिक डेटा भ्रष्टाचार हो रहा है (हो सकता है कि कुछ सौ बाइट्स या बीच में हो)।
इस बिंदु पर मैंने इसे या तो nginx के FastCGI हैंडलर या Django के FastCGI हैंडलर (यानी शायद फ़्लॉप में बग) में बग होने के लिए संकुचित कर दिया है, क्योंकि यह समस्या तब नहीं होती है जब मैं स्टैंडअलोन (यानी runserver
) मोड में Djit सर्वर चलाता हूं । यह केवल FastCGI मोड में होता है।
अन्य दिलचस्प रुझान:
यह बड़ी प्रतिक्रियाओं पर होता है। जब कोई क्लाइंट पहली बार लॉग इन करता है, तो उन्हें सर्वर डीबी तक सिंक करने के लिए 1 एमबी चंक्स का एक गुच्छा भेजा जाता है। उस पहले सिंक के बाद, प्रतिक्रियाएं बहुत छोटी होती हैं (आमतौर पर एक समय में कुछ केबी)। भ्रष्टाचार शुरू में भेजे गए उन 1 एमबी चंक्स पर हमेशा लगता है।
यह अधिक बार होता है जब क्लाइंट लैन (यानी कम-विलंबता, उच्च-बैंडविड्थ कनेक्शन) के माध्यम से सर्वर से जुड़ा होता है। इससे मुझे लगता है कि नगीनक्स या फ़्लॉप में किसी प्रकार की दौड़ की स्थिति है जो एक बढ़ी हुई डेटा दर से बढ़ा है।
अभी, मुझे प्रतिक्रिया हैडर में एक अतिरिक्त SHA1 डाइजेस्ट डालकर इसके चारों ओर काम करना है, और क्लाइंट ने उन प्रतिक्रियाओं को अस्वीकार कर दिया है जहां हेडर बॉडी चेकसम से मेल नहीं खाता है, लेकिन यह एक भयानक समाधान की तरह है।
क्या किसी और को ऐसा कुछ भी अनुभव हुआ है, या कोई संकेत है कि कैसे पहचानें कि क्या यह फ्लॉप या नगनेक्स है जो यहां गलती पर है इसलिए मैं उपयुक्त टीम के साथ बग दर्ज कर सकता हूं?
किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद।
नोट: मैंने कुछ समय पहले भी lighttpd + FastCGI + Django में एक समान बग पोस्ट किया था: /programming/3714489/lighttpd-fastcgi-django-truncated-response-sent-to-client-due-to -अनुभवी ... भले ही यह एक ही चीज़ (भ्रष्टाचार बनाम भ्रष्टाचार) नहीं है, लेकिन ऐसा लगने लगा है कि आम अपराधी वेब सर्वर के बजाय फ़्लॉप / Django है।
संपादित करें: मुझे यह भी ध्यान देना चाहिए कि मेरा पर्यावरण क्या है:
मैक मिनी पर OSX 10.6.6
अजगर 2.6.1 (सिस्टम)
Django 1.3 (आधिकारिक टारबॉल से)
फ्लाप 1.0.2 (फ्लॉप साइट पर पायथन अंडे से)
nginx + ssl 1.0.0 (Macports से)
EDIT: जेरज़ेक की टिप्पणी के जवाब में, कोड पथ जो प्रतिक्रिया को इकट्ठा करता है, ऐसा लगता है (रसीलापन के लिए संपादित):
# This returns an objc NSData object, which is an array.array
# when pushed through the PyObjC bridge
ret = handler( request )
response = HttpResponse( ret )
response[ "Content-Length" ] = len( ret )
return response
मुझे नहीं लगता कि यह संभव है कि उस पर आधारित सामग्री-लंबाई गलत है, और AFAIK में पाठ के विपरीत स्पष्ट रूप से द्विआधारी के रूप में एक Django HttpResponse वस्तु को चिह्नित करने का कोई तरीका नहीं है। इसके अलावा, चूंकि यह समस्या केवल रुक-रुक कर होती है, इसलिए मुझे नहीं लगता कि यह इसे समझाता है अन्यथा संभवतः आप इसे हर अनुरोध पर देखेंगे।
EDIT @ionelmc: आपको Django में सामग्री-लंबाई निर्धारित करनी होगी - nginx ने आपके लिए यह सेट नहीं किया है, जैसा कि नीचे दिए गए उदाहरण के अनुसार एक बार मैंने सामग्री-लंबाई को स्पष्ट रूप से अक्षम कर दिया:
$ curl -i http://localhost/io/ping
HTTP/1.1 200 OK
Server: nginx/1.0.0
Date: Thu, 23 Jun 2011 13:37:14 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
AKSJDHAKLSJDHKLJAHSD