2012-09-10 13 views
5

को फिर से लिखना मेरे पास एक एकल django-admin ऐप है जिसे myapp नाम दिया गया है कि मैं अलग-अलग भौतिक बक्से, प्रति ग्राहक एक पर कई उदाहरणों को तैनात करना चाहता हूं। हालांकि, मैं उन्हें सभी को एक समान डोमेन, mydomain.com/customer1/myapp से एक्सेस करना चाहता हूं।nginx proxy_pass के साथ एकाधिक django ऐप्स और

मैं विशिष्ट प्रॉक्सी सेटिंग्स के साथ fiddled किया है और इतने पर सुझाव कई चीजों की कोशिश की, लेकिन कोई भी काफी अपने प्रयोग के मामले फिट ... और जब से मैं दोनों nginx और django मैं एक नुकसान में हूँ बारे में बहुत कम जानते हैं!

मेरे वर्तमान nginx.conf है:

server { 
    listen 80; 
    server_name myserver.com 

    location ^~ /static { 
     alias /path/to/static/files/; 
    } 
# location/{ 
#  proxy_pass http://127.0.0.1:8001; 
# } 
    location ^~ /customer1/myapp/static { 
     alias /path/to/static/files/; 
    } 
    location /customer1/myapp { 
     rewrite ^/customer1/myapp/(/?)(.*) /$2 break; 
     proxy_pass http://127.0.0.1:8001; 
    } 
} 

मैं myserver.com/customer1/myapp/admin के माध्यम से अपेक्षित रूप से लॉगिन स्क्रीन पर मिल सकती है। हालांकि जब मैं लॉग इन करने का प्रयास करता हूं, nginx मेरे यूआरएल को myserver.com/admin पर फिर से लिखता है जो मान्य यूआरएल नहीं है। मैं वास्तव में यूआरएल को फिर से लिखने से nginx कैसे रखूं और केवल 127.0.0.1:8001 पर पारित यूआरएल को बदलूं?

एफडब्ल्यूआईडब्ल्यू, मैं gunicorn -b 127.0.0.1:8001 -n myapp के साथ सेवा करने के लिए बंदूक का उपयोग कर रहा हूं। अगर मैं / स्थान को अनदेखा करता हूं और पिछले दो स्थान ब्लॉक को हटा देता हूं, तो ऐप बहुत अच्छा काम करता है।

यदि विकल्प हैं तो मैं इस दृष्टिकोण पर बहुत दूर हूं। लक्ष्य प्रत्येक परिनियोजन के लिए django कोड को संशोधित करने से बचने के लिए है और इसके बजाय नए तैनाती के लिए nginx.conf में न्यूनतम कोड जोड़ें।

+0

परिनियोजन के बारे में प्रश्न serverfault.com –

+0

के लिए अधिक उपयुक्त हो सकते हैं, मुझे समझ में नहीं आ रहा है, क्या आप सिर्फ डीजेंगो यूआरएल को/ग्राहक// myapp/admin/के बजाय/admin/उत्पन्न करने के लिए रिवर्स बनाने की कोशिश कर रहे हैं? – jpic

+0

@jpic नहीं, मैं चाहता हूं कि django केवल रूट यूआरएल देखें। जैसे '127.0.0.1: 8001/admin'। मुझे लगता है कि मैं इसे nginx के साथ कर सकता हूं, लेकिन मुझे यकीन नहीं है कि कैसे। और 'serverfault.com' के बारे में नोट किया, अगर मैं यहां कुछ भी नहीं समझता, तो मैं वहां पोस्ट करूंगा, धन्यवाद। – Justin

उत्तर

16

मूल रूप से, आप proxy_pass निर्देश के भाग के रूप यूआरएल निर्दिष्ट करें, निम्न स्थान के निर्देश यह करना चाहिए:

location ~ ^/customer1/myapp(/?)(.*) { 
    proxy_pass http://127.0.0.1:8001/$2; 
} 

कैसे nginx गुजरता uri

+1

इसके लिए धन्यवाद, मुझे नहीं पता था कि मैं निम्नलिखित अभिव्यक्ति में समूहों का उपयोग कर सकता हूं। हालांकि, यह ब्राउज़र में मेरा यूआरएल फिर से लिखता है 'http: //127.0.0.1: 8001/$ 2' मैं इसे रहने के लिए पसंद करूंगा। यह django-admin लॉगिन स्क्रीन के साथ भी अच्छा नहीं खेलता है। – Justin

+1

यह अधिकांश ऐप के लिए अच्छा काम करता है और मैंने स्वीकार किया है, लेकिन मुझे सबसे अच्छा समाधान यूआरएल के मुख्य भाग में ग्राहक को शामिल करने के बजाय सबडोमेन 'customer.myserver.com' का उपयोग करना था। – Justin

+1

यह उत्तर एक खराब अभ्यास है; मुद्दों के स्पष्टीकरण के लिए कृपया http://serverfault.com/a/728792/110020 देखें। – cnst

3

आप का उपयोग करना चाहिए पर विस्तृत विवरण के लिए http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass देखना निम्नलिखित:

location /customer1/myapp { 
    return 302 $uri/; 
} 
location /customer1/myapp/ { 
    proxy_pass http://127.0.0.1:8001/ 
} 

नोट इस proxy_pass भीतर वैरिएबल का उपयोग करने के लिए बेहतर है, क्योंकि यदि आप उपयोग करना चर, तो proxy_redirect अब डिफ़ॉल्ट मान default का नहीं हो सकता है, और इसके बजाय off होगा, और उसके बाद आंतरिक 302 आपके ऐप के भीतर रीडायरेक्ट को /customer1/myapp/ पर मैग्नैक्स द्वारा प्राप्त किए जाने के बाद मैप नहीं किया जाएगा, जो आपको परेशानियों और 404 के कारण होने की संभावना है।

और, हाँ, अलग-अलग ग्राहकों के लिए अलग-अलग डोमेन का उपयोग करना एक बेहतर विचार है, क्योंकि यह अधिक सुरक्षित है (जहां तक ​​कुकी हैंडलिंग का संबंध है, उदाहरण के लिए)।

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