2016-09-14 6 views
10

से बाहरी यूआरएल के लिए एक POST अनुरोध करना मैं django + nginx + gunicorn पर चल रहे किसी वेब एप्लिकेशन के अंदर एक विधि से एक पोस्ट अनुरोध भेज रहा हूं। Django के अपने सर्वर (रनरवर का उपयोग करके) पर निष्पादित होने पर मुझे उसी कोड से 200 प्रतिक्रिया प्राप्त करने में कोई समस्या नहीं है।django + gunicorn + nginx सेटअप

try: 
    response = requests.post(post_url, data=some_data) 
    if response.status_code == OK and response.content == '': 
     logger.info("Request successful") 
    else: 
     logger.info("Request failed with response({}): {}".format(response.status_code, response.content)) 
     return response.status_code == OK and response.content == '' 
except requests.RequestException as e: 
    logger.info("Request failed with exception: {}".format(e.message)) 
    return False 

मैंने post_url पर सर्वर लॉग की जांच की है, यह वास्तव में इस डेटा के साथ 200 प्रतिक्रिया लौटा रहा है। हालांकि, जब मैं बंदूक और nginx के पीछे ऐप चलाता हूं, तो मुझे प्रतिक्रिया प्राप्त नहीं होती है, (हालांकि अनुरोध भेजा जा रहा है)। प्रयास ब्लॉक के बाद पहली पंक्ति में कोड फंस जाता है, और बंदूकधारी कार्यकर्ता का समय समाप्त होता है (30 सेकंड के बाद)।

यह POST_URL पर अपाचे सर्वर लॉग है:

[14/Sep/2016:13:19:20 +0000] "POST POST_URL_PATH HTTP/1.0" 200 295 "-" "python-requests/2.9.1" 

अद्यतन:

मैं उल्लेख करना भूल गया, इस अनुरोध को एक दूसरे पर अमल करने से भी कम समय लेता है, तो यह समय समाप्त नहीं है मुद्दा। विन्यास के साथ कुछ गलत है? मेरे पास मानक nginx + gunicorn सेटअप है, जहां gunicorn nginx में proxy_pass के रूप में सेट किया गया है। मैं अनुमान लगा रहा हूं क्योंकि मैं एक nginx प्रॉक्सी के पीछे हूँ, क्या मुझे आवेदन से एक पोस्ट अनुरोध भेजते समय कुछ अलग करना चाहिए?

+0

जैसा कि आप निदान के लिए कुछ उपयोगी जानकारी प्रदान करते हैं, मुझे लगता है कि आपके पास {} प्रकार की त्रुटि हो सकती है: - ऐसा लगता है कि आप http अनुरोध प्राप्त कर सकते हैं लेकिन परिणाम प्राप्त नहीं कर सकते हैं। सबसे पहले, अपने फ़ायरवॉल को चेकआउट करें (संभवतः 'iptables -L' कमांड हो और देखें कि आपके' INPUT' तालिका पर पोर्ट 80 के बारे में कोई नियम है या नहीं)। - क्या आपका अनुरोध एक गैर विश्वसनीय सर्वर पर https अनुरोध है? - क्या आपने किसी अन्य सर्वर तक पहुंचने का प्रयास किया है? – artragis

+1

आपके पास कितने बंदूकधारी कर्मचारी हैं? – VBart

+0

@artragis मैं django खोल का उपयोग कर अनुरोध को सफलतापूर्वक निष्पादित कर सकता हूं। मैं उसी मशीन पर किसी भी मुद्दे के बिना एक पायथन स्क्रिप्ट में एक ही कोड चला सकता हूं। – SeeknInspYre

उत्तर

4

मेरी बंदूक सेटिंग्स में, workers=2 सेटिंग इस समस्या को हल करती है।

जब मैं बाहरी यूआरएल से अनुरोध भेज रहा था, तो बाहरी आवेदन एक अनुरोध वापस भेज देगा। यह नया अनुरोध आवेदन में एकमात्र कार्यकर्ता पर कब्जा करेगा। मैंने जो मूल अनुरोध भेजा है वह कार्यकर्ता रहित है, और इसलिए यह अटक गया है। 2 श्रमिकों के साथ, मैं एक साथ अनुरोध भेज सकता हूं और एक और अनुरोध प्राप्त कर सकता हूं।

-1

यह एक बंदूकधारी टाइमआउट मुद्दा है। आप गनिकोर्न निष्पादित करने के लिए उपयोग कर रहे कमांड में अतिरिक्त ध्वज --timeout 60 निर्दिष्ट करके बंदूक के समय समाप्ति को बढ़ा सकते हैं। बेशक, आप अपनी जरूरतों के आधार पर टाइमआउट लंबाई को कस्टमाइज़ कर सकते हैं। तर्क सेकंड में है।

+0

यह एक टाइमआउट मुद्दा नहीं है। बंदूक के बिना, पोस्ट अनुरोध खत्म करने के लिए एक सेकंड से भी कम समय लेता है। – SeeknInspYre

0

आपको निगेंक्स के साथ समस्या हो सकती है, जहां समस्या nginx request entity too large हो सकती है। यदि आप सर्वर पर बहुत बड़ा डेटा भेजते हैं, तो Nginx अनुरोध को अस्वीकार कर सकता है। जब हम बहुत बड़ी छवि अपलोड करने की कोशिश कर रहे थे तो हमें समस्या के कारण निगेंक्स के साथ समस्याएं थीं। हम dginango के साथ nginx + gunicorn का भी उपयोग कर रहे हैं। तो मुझे संदेह है। यह एक ही मुद्दा हो सकता है।

+0

नहीं, मैं बस कुछ डेटा के साथ एक छोटी पायथन वस्तु भेज रहा हूं, कुछ भी बड़ा नहीं। वैसे भी मैं इसे डीबग कर सकता हूं? – SeeknInspYre

+0

इसके अलावा, अनुरोध भेजा जा रहा है, मुझे प्रतिक्रिया प्राप्त नहीं हो रही है, यह सब कुछ है – SeeknInspYre

संबंधित मुद्दे