2011-06-20 5 views
7

के बावजूद मैं एक WSGI-ऐप (एक Django परियोजना) 127.0.0.1:18731 पर gunicorn के तहत चल रहा है और मैं mod_proxy साथ अपाचे का उपयोग http://example.com/my-project/* से http://127.0.0.1:18731/* करने के लिए अनुरोध पुनर्निर्देशित करने के लिए। स्टेटिक फाइल /my-project/ के बाहर संग्रहीत हैं। यदि Django ऐप को कुछ भी रीडायरेक्ट करने की आवश्यकता नहीं है, तो यह ठीक काम करता है, लेकिन अगर यह एक अनुरोध को रीडायरेक्ट करने का प्रयास करता है (उदाहरण के लिए http://example.com/my-project/foo पर पिछला स्लैश जोड़ने के लिए), तो यह URL से /my-project/ को हटा देता है, जिससे मुझे अमान्य यूआरएल छोड़ दिया जाता है। http://example.com/foo/gunicorn परियोजना के दायरे के बाहर रीडायरेक्ट हो रहा है, ProxyPassReverse

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 
ProxyRequests On 
ProxyPass /my-project/ http://127.0.0.1:18731/ retry=0 
ProxyPassReverse /my-project/ http://127.0.0.1:18731/ retry=0 
ProxyPreserveHost On 
ProxyErrorOverride Off 

मैं अपने सभी URL को /my-project/ उपसर्ग के लिए Django मजबूर करने के लिए नहीं करना चाहती पोर्टेबिलिटी के हित में,:

मेरे mod_proxy विन्यास इस प्रकार है। अपाचे को ProxyPassReverse लाइन के साथ अपने आप उपसर्ग को संभालना चाहिए। मैं क्या गलत कर रहा हूं?

उत्तर

0

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

उस ने कहा, मैं पहले Chris's answer को आजमाने की सलाह दूंगा। मैंने व्यक्तिगत रूप से इसका परीक्षण नहीं किया है लेकिन उसकी तर्क ध्वनि है (यद्यपि मेरे लिए कुछ महीने बहुत देर हो चुकी हैं)।

+0

आपको समाधान के बारे में क्या पसंद नहीं है? –

+0

मैं अपने व्यक्तिगत सबडोमेन के तहत उपलब्ध होने वाले ऐप्स के लिए विशेष रूप से Django के लिए एक नया निर्माण करने के बजाय चाहता हूं। – Fraxtil

2

क्या आपने इसे आजमाया? मैंने यूआरएल में अपनी परियोजना को जोड़ा जो आप भी प्रॉक्सी कर रहे हैं।

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 
ProxyRequests On 
ProxyPass /my-project/ http://127.0.0.1:18731/my-project/ retry=0 
ProxyPassReverse /my-project/ http://127.0.0.1:18731/my-project/ retry=0 
ProxyPreserveHost On 
ProxyErrorOverride Off 

मैं आमतौर पर इस तरह की चीज़ के लिए nginx का उपयोग करता हूं, इसलिए मुझे यकीन नहीं है कि यह काम करेगा या नहीं।

अद्यतन: उपरोक्त काम कुछ और करने की कोशिश नहीं कर रहा था।

इस तरह कुछ कोशिश करें और देखें कि इससे मदद मिलती है या नहीं। यह थोड़ा अलग सेटअप है। यह मीडिया को छोड़कर सब कुछ प्रॉक्सी करता है जो उपनाम के माध्यम से परोसा जाता है। यह/मेरी परियोजना/बिल्कुल होने की आवश्यकता को हटा देता है।

<VirtualHost *:80> 
ServerName example.com 
UseCanonicalName On 
ServerAdmin [email protected] 

LogLevel warn 
CustomLog /var/log/apache2/example.com/access.log combined 
ErrorLog /var/log/apache2/example.com/error.log 
ServerSignature On 

Alias /media/ /home/example/example.com/pysrc/project/media/ 

ProxyPass /media/ ! 
ProxyPass/http://127.0.0.1:18731/ 
ProxyPassReverse/http://127.0.0.1:18731/ 
ProxyPreserveHost On 
ProxyErrorOverride Off 
</VirtualHost> 
+0

यह काम नहीं करता। Django अनुरोधों की उम्मीद कर रहा है उदा।/foo /, नहीं/my-project/foo /, तो प्रॉक्सीपास जिस तरह से सही हो, सही होना चाहिए। ProxyPassReverse को बदलने से मेरा अंत कोई प्रभाव नहीं पड़ता है, जिससे मुझे विश्वास होता है कि इसका उपयोग नहीं किया जा रहा है। – Fraxtil

+0

मेरे उत्तर को दूसरे विकल्प के साथ अपडेट किया गया यह देखें कि क्या यह मदद करता है। –

+0

यह भी ध्यान दें कि प्रॉक्सी रिक्वेस्ट गुम है जिसका मतलब है कि यह डिफ़ॉल्ट रूप से बंद हो जाएगा जो आमतौर पर रिवर्स प्रॉक्सी के लिए आपके पास है। अगर यह काम नहीं करता है तो खेलने के लिए एक और सेटिंग proxypreservehost है। –

6

मुझे यह समस्या थी। इसलिए Host: हैडर से पारित कर दिया जाता है,

  • ProxyPreserveHost On और एप्लिकेशन होस्टनाम ग्राहक पर हमें देखता है जानता है:

    ProxyPreserveHost On 
    
    <Location "/my-project/"> 
        ProxyPass http://127.0.0.1:18173/my-project/ 
        ProxyPassReverse http://127.0.0.1:18173/my-project/ 
        RequestHeader set SCRIPT_NAME /my-project 
        RequestHeader set X-FORWARDED-PROTOCOL ssl 
        RequestHeader set X-FORWARDED-SSL on 
    </Location> 
    

    एक पूर्ण यूआरएल हम जरूरत के निर्माण के लिए WSGI एप्लिकेशन सक्षम करने के लिए।

  • SCRIPT_NAME शीर्षलेख जोड़ें ताकि ऐप जानता है कि इसकी जड़ कहां है।
  • X-FORWARDED- हेडर आवश्यकतानुसार सेट करें। मैं एसएसएल का भी उपयोग कर रहा हूं, इसलिए मुझे ऐप को बताना होगा कि इसे https योजना का उपयोग करना चाहिए।

मैं <Location> निर्देशों का उपयोग करता हूं, क्योंकि मैं इस vhost पर बहुत अधिक सामान करता हूं। लेकिन आप pathProxyPass और ProxyPassReverse निर्देशों के तर्कों को पारित करके आसानी से इसे फिर से लिख सकते हैं।

एनबी: ProxyRequests बंद होना चाहिए, जब तक कि आप आगे की प्रॉक्सी भी नहीं चाहते। यदि आप इसे पढ़ रहे हैं तो शायद आप केवल एक उलटा प्रॉक्सी चाहते हैं।

Django विशिष्ट ध्यान दें: settings.LOGIN_URLप्रयोग किया जाता है के रूप में है, तो आप अपने आप को यह करने के लिए SCRIPT_NAME पहले जोड़ें की आवश्यकता होगी।

0

मैं वास्तविक डोमेन नाम के लिए ProxyPassReverse config की स्थापना करके मूल समस्या हल कर दिया है:

ProxyPass /my-project/ http://127.0.0.1:18731/ 
ProxyPassReverse /my-project/ http://mydomain.com/ 

सुझाव: Apache ProxyPassReverse values

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