2010-02-16 1 views
8

मैंने अपने अनुप्रयोग को चेरीपी 3.1.2 का उपयोग करके Nginx के पीछे एक रिवर्स-प्रॉक्सी के रूप में कॉन्फ़िगर किया है। सभी GET अनुरोधों के लिए सही काम कर रहे हैं, लेकिन सभी POST अनुरोध HTTP 400 लौटाए गए हैं - विकृत हेडर।Nginx रिवर्स-प्रॉक्सी के पीछे CherryPy POST अनुरोध दूषित/छिड़काव

मैं CherryPy WSGI-सर्वर स्रोत कोड में पता लगाया अनुरोध को संभालने कोड को देखने के लिए और पता चला कि अगर प्राप्त के लिए पहला अनुरोध लाइन का अनुरोध करता है सही ढंग से उदाहरण के लिए की तरह पढ़ता है:

GET /home HTTP/1.0 
पोस्ट के लिए

का अनुरोध करता है यह की तरह है :

<HTTP headers truncated at front> 

POST /home HTTP/1.0 

बजाय सही ढंग से गठन अनुरोध को GET/पोस्ट अनुरोध लाइन HTTP हेडर के बाद, पोस्ट के लिए युक्त अनुरोध करता है अपने आवेदन Nginx ओर से प्राप्ति:

  1. पहले HTTP हेडर लाइनों फिर बाइट्स
  2. की कुछ संख्या एक रिक्त पंक्ति से शुरू से ही छोटा कर दिया अंत आयुध डिपो HTTP हेडर
  3. फिर एक "पोस्ट/घर HTTP/1.0", जो स्पष्ट रूप से एक पहली पंक्ति के रूप उम्मीद थी यह दर्शाता है अनुरोध का
  4. संपादित करें: यह अनुरोध का अंत है, इसलिए कोई भी बॉडी डेटा नहीं है जो HTTP पोस्ट हेडर का पालन करना चाहिए।

साथ ही, p.1 से काट-छांट के बाइट की संख्या कितना पोस्ट डेटा वहाँ एक फार्म पर है, उदाहरण के लिए अधिक वर्ण मैं/घर प्रपत्र फ़ील्ड्स, में अधिक वर्ण में टाइप पर निर्भर करने लगता है HTTP शीर्षलेख हटा दिए जाते हैं।

स्पष्ट रूप से Nginx किसी भी तरह हेडर को दूषित कर रहा है जब यह इसे अपस्ट्रीम सर्वर (मेरा एप्लिकेशन) में भेजता है।
लेकिन जब मैं सिर्फ परीक्षण के लिए Nginx को कुछ बाहरी वेब साइटों पर रीडायरेक्ट करता हूं (POST अनुरोधों का भी उपयोग कर रहा हूं) - सब कुछ ठीक हो जाता है।

तो अब मैं बहुत अटक गया हूं।/2.5.1/3.1.2 Windows XP प्रो, अजगर, CherryPy, Nginx/0.8.32
ब्राउज़र::

मेरे विन्यास है फ़ायर्फ़ॉक्स 2.0, IE 7.0
मेरा आवेदन (चल स्टैंडअलोन) है आम तौर पर काम कर रहा है और कई विन्यास के तहत परीक्षण किया।

मैं की तरह सुंदर बुनियादी Nginx config का उपयोग करें:

upstream backend { 
    server localhost:8088 weight=1; 
} 
server { 
    listen 80; 
    server_name localhost; 

    location/{ 
     #proxy_read_timeout 300; 

     proxy_pass http://backend; 
     #proxy_redirect default; 
    } 
} 

हालांकि कोशिश की कई अन्य उदाहरण और proxy_pass के विन्यास नेट पर मिल गया।

कोई विचार जहां समस्या की तलाश है? Nginx विन्यास, मेरे चेरीपी ऐप या कहीं और?

नया: मुझे पता चला कि यह सही तरीके से काम करता है लेकिन केवल शून्य अनुरोधों के लिए शून्य निकाय के लिए अनुरोध करता है (परीक्षण के लिए किसी भी फ़ील्ड के बिना खाली बना दिया जाता है)।
और सत्यापित किया कि भिखारी से छिद्रित बाइट्स की गिनती सामग्री-लंबाई + कुछ छोटी कॉन्स संख्या (शायद 2) के बराबर है।

+0

क्या यह एकल अनुरोधों के साथ भी होता है? यदि आप अनुरोध निकाय के लिए बाइट्स की गलत संख्या पढ़ते हैं, तो आप कई अनुरोधों पर रख-रखाव के साथ समस्याएं प्राप्त कर सकते हैं, जो तब हो सकता है जब लाइन के साथ कुछ विंडोज़ पर बाइनरी के बजाय टेक्स्ट मोड IO का उपयोग कर रहा हो (जो सीएफएलएफ अनुक्रमों को एलएफ में बदलता है, 'सामग्री-लंबाई' बाइट गिनती को फेंकना)। – bobince

+0

हां, यह तब होता है जब ऐप को पुनरारंभ करने और Nginx को पुनः लोड करने के बाद यह पहला अनुरोध होता है। –

उत्तर

1

आप मानकों की कोशिश कर सकते:

ignore_invalid_headers on; 
sendfile     on; 
http ब्लॉक में

... भी keepalives अक्षम करने का प्रयास करें और सुनिश्चित करें कि आप डिबग करने के लिए उपयोग/त्रुटियों प्रवेश कर रहे हैं हो सकता है।

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