हम समानांतर में एक पायथन वेब सेवा और क्लाइंट वेबसाइट विकसित कर रहे हैं। जब हम सेवा करने के लिए ग्राहक से एक HTTP अनुरोध बनाने के लिए, एक कॉल लगातार socket.py में एक socket.error, पढ़ने में जन्म देती है:104, 'सहकर्मी सॉकेट त्रुटि द्वारा कनेक्शन रीसेट, या जब एफआईएन के बजाय आरएसटी में सॉकेट परिणाम बंद करता है?
(104, 'Connection reset by peer')
जब मैं wireshark साथ में सुनने के लिए, "अच्छा" और "बुरा "प्रतिक्रियाएं बहुत समान दिखती हैं:
- ओएथ हेडर के आकार के कारण, अनुरोध दो पैकेट में विभाजित है। सेवा एसीके
- दोनों के साथ प्रतिक्रिया देती है, सेवा प्रतिक्रिया भेजती है, प्रति हेडर एक पैकेट (HTTP/1.0 200 ठीक है, फिर दिनांक शीर्षलेख इत्यादि)। ग्राहक एसीके के साथ प्रत्येक को जवाब देता है।
- (अच्छा अनुरोध) सर्वर एक एफआईएन, एसीके भेजता है। ग्राहक एक एफआईएन, एसीके के साथ जवाब देता है। सर्वर एसीके का जवाब देता है।
- (खराब अनुरोध) सर्वर एक आरएसटी, एसीके भेजता है, क्लाइंट एक टीसीपी प्रतिक्रिया नहीं भेजता है, सॉकेट। ग्राहक पक्ष पर आतंक उठाया जाता है।
दोनों वेब सेवा और क्लाइंट एक जेनेटू लिनक्स x86-64 बॉक्स पर चल रहे हैं glibc-2.6.1 चल रहे हैं। हम उसी वर्चुअल_एनवी के अंदर पाइथन 2.5.2 का उपयोग कर रहे हैं।
क्लाइंट एक Django 1.0.2 ऐप है जो अनुरोध करने के लिए httplib2 0.4.0 को कॉल कर रहा है। हम OAuth हस्ताक्षर एल्गोरिदम के साथ अनुरोधों पर हस्ताक्षर कर रहे हैं, OAuth टोकन हमेशा खाली स्ट्रिंग पर सेट होता है।
सेवा WERKZEUG 0.3.1, जो पायथन के wsgiref.simple_server उपयोग कर रहा है चल रहा है। मैं wgsiref.validator के माध्यम से WSGI ऐप चलाया बिना किसी समस्या के।
ऐसा लगता है कि यह डीबग करना आसान होना चाहिए, लेकिन जब मैं सेवा पक्ष पर एक अच्छे अनुरोध के माध्यम से पता लगाता हूं, तो यह socket._socketobject.close() फ़ंक्शन में, खराब अनुरोध की तरह दिखता है, प्रतिनिधि तरीकों को बदलता है डमी विधियों। जब प्रेषण या प्रेषण (जिसे याद नहीं किया जा सकता) विधि बंद कर दी जाती है, तो एफआईएन या आरएसटी भेजा जाता है, और ग्राहक प्रसंस्करण शुरू कर देता है।
"सहकर्मी से कनेक्शन रीसेट" सेवा पर दोष जगह करने लगता है, लेकिन मैं या तो httplib2 पर भरोसा नहीं करते। क्या ग्राहक गलती हो सकता है?
** इसके अलावा डिबगिंग - लिनक्स पर सर्वर **
मैं एक मैकबुक है की तरह लग रहा है, इसलिए मैं एक पर सेवा और अन्य पर ग्राहक वेबसाइट चला की कोशिश की। लिनक्स क्लाइंट बग के बिना ओएस एक्स सर्वर को कॉल करता है (एफआईएन एसीके)। ओएस एक्स क्लाइंट लिनक्स सेवा को बग (आरएसटी एसीके, और ए (54, 'पीयर द्वारा कनेक्शन रीसेट') के साथ कॉल करता है)। तो, ऐसा लगता है कि यह लिनक्स पर चल रही सेवा है। क्या यह x86_64 है? एक बुरा glibc? wsgiref? फिर भी देख ...
** इसके अलावा परीक्षण - wsgiref परतदार **
हम अपाचे और mod_wsgi के साथ उत्पादन करने के लिए चले गए हैं लग रहा है, और कनेक्शन फिर सेट करता है चले गए हैं। नीचे मेरा जवाब देखें, लेकिन मेरी सलाह है कि कनेक्शन रीसेट लॉग करें और पुनः प्रयास करें। इससे आपके सर्वर को विकास मोड में और उत्पादन में दृढ़ता से चलने दिया जाएगा।
सवाल वास्तव में है। क्लाइंट को कनेक्शन रीसेट करना होगा और 'सहकर्मी द्वारा कनेक्शन रीसेट' संदेश को सूचित करना होगा। तो मुझे लगता है कि आप सही ट्रैक पर हैं –