nginx

2011-11-15 21 views
18

के पीछे एक उपनगर के नीचे django को कैसे तैनात करें मेरे पास http://localhost:12345 पर चल रहा एक django अनुप्रयोग है। मैं उपयोगकर्ता को यूआरएल http://my.server.com/myapp के माध्यम से इसे एक्सेस करना चाहता हूं। मैं nginx का उपयोग जैसे कि यह करने के लिए प्रॉक्सी उल्टा करने के लिए निम्नलिखित:nginx

... ... 
server_name my.server.com; 
location /myapp { 
    rewrite /myapp(.*) $1 break;   
    ... ... # proxy param 
    proxy_pass http://localhost:12345; 
} 
... ... 

सवाल है, जब ऊपर की तरह कॉन्फ़िगर किया गया है, कैसे बनाने के लिए मेरी प्रतिक्रिया पन्नों में यूआरएल "/ MyApp" इतना है कि का एक उपसर्ग है करने के लिए nginx उन्हें सही ढंग से myapp को निर्देशित कर सकते हैं। उदाहरण के लिए, "/ foo/far" जैसे किसी पृष्ठ में यूआरएल को nginx प्रॉक्सी को myapp में अनुमति देने के लिए "/ myapp/foo/bar" में बदला जाना चाहिए। यह प्राप्त करने के लिए उपयोग करने के लिए सही nginx कॉन्फ़िगरेशन क्या है?

मैं रूट यूआरएल उपसर्ग निर्दिष्ट करने के लिए django के सेटिंग्स चर का उपयोग कर सकता हूं, लेकिन यह मेरे दिमाग में फ्लेक्सिबल नहीं है, क्योंकि परिवर्तनीय को विभिन्न nginx कॉन्फ़िगरेशन के अनुसार संशोधित किया जाना चाहिए (एक दिन nginx से उपन्यास बदल सकता है "/ myapp "to"/anotherapp ")।

उत्तर

11

जैसा कि उपसर्ग Nginx में सेट है, Django ऐप होस्ट करने वाले वेब सर्वर के पास URL उपसर्ग जानने का कोई तरीका नहीं है। जैसा कि ओर्ज़ेल ने कहा था, अगर आपने nginx + gunicorn/uwsgi (कुछ अतिरिक्त कॉन्फ़िगरेशन के साथ) के अपाचे + mod_wsgi का उपयोग किया है, तो आप WSGIScriptAlias ​​मान का उपयोग कर सकते हैं, जिसे स्वचालित रूप से Django द्वारा पढ़ा जाता है।

जब मैं एक यूआरएल उपसर्ग का उपयोग करने की जरूरत है, मैं आम तौर पर यह अपने आप को मेरे जड़ urls.py, जहां मैं केवल एक लाइन है, उपसर्ग लगाया जाता है में डाल दिया और एक अन्य urls.py

(r'^/myapp/', include('myapp.urls')), 

सहित लेकिन मुझे लगता है कि सेटिंग्स.py में उपसर्ग सेट करने की तुलना में यह एक ही बाधा है, आपके पास nginx और Django में अनावश्यक विन्यास है।

आपको अपने Django ऐप को होस्ट करने वाले सर्वर में कुछ करने की आवश्यकता है: 12345। आप वहां उपसर्ग सेट कर सकते हैं, और डब्लूजीजीआईस्क्रिप्ट एलीआस या इसके बराबर mod_wsgi के बाहर Django को पास कर सकते हैं। मैं अधिक जानकारी नहीं दे सकता क्योंकि मुझे नहीं पता कि आपका Django एप्लिकेशन कैसे चलाया जाता है। इसके अलावा, शायद आपको यूडब्ल्यूएसजीआई या गनिकोर्न का उपयोग करके, डीजेगो से सीधे अपने Django ऐप को चलाने पर विचार करना चाहिए।

वेबसर्वर से Django के लिए उपसर्ग पास करने के लिए, तो आप इस का उपयोग कर सकते हैं:

proxy_set_header SCRIPT_NAME /myapp; 

अधिक जानकारी here

+1

धन्यवाद, ध्वनि मैं इस पोस्ट के लिए WSGIScriptAlias ​​चाल –

+2

धन्यवाद अच्छाई के साथ जाना है की तरह। "Proxy_set_header" चाल ने मुझे Google खोज के दुःस्वप्न से बचाया। मुझे बेहतर जाना चाहिए था। ग्रेसियस। –

6

आप अपनी सेटिंग को अपडेट करना होगा:

USE_X_FORWARDED_HOST = True 
FORCE_SCRIPT_NAME = /myapp 

और तदनुसार अपने MEDIA_URL और STATIC_URL अपडेट करें।

मुझे nginx के तहत तैनाती का अनुभव नहीं मिला है, लेकिन अपाचे के तहत, यह ठीक काम करता है। का संदर्भ लें: https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host

2

यहां nginx के लिए मेरी कॉन्फ़िगरेशन का हिस्सा है जो स्वीकार्य रूप से FORCE_SCRIPT_NAME सेट नहीं करता है, लेकिन फिर, मैं उपनिर्देशिका का उपयोग नहीं कर रहा हूं। शायद यह Django के बजाय nginx में USE_X_FORWARDED_HOST से संबंधित विकल्पों को सेट करने के लिए उपयोगी होगा।

upstream app_server_djangoapp { 
    server localhost:8001 fail_timeout=0; 
} 

server { 
    listen xxx.xxx.xx.xx:80; 
    server_name mydomain.com www.mydomain.com; 
    if ($host = mydomain.com) { 
     rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent; 
    } 
    ... 
    location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 

     if (!-f $request_filename) { 
      proxy_pass http://app_server_djangoapp; 
      break; 
     } 
    } 
    ... 
}