2011-11-04 17 views
9

अस्वीकरण:Django, nginx के साथ कस्टम गुम शीर्षक और gunicorn

मैं एक परियोजना जहां एक "विशाल" webapp मोबाइल के लिए एक API है जो अस्तित्व में काम कर रहा हूँ, इसलिए बदल एपीआई एक विकल्प नहीं है।

यह आवेदन समय पहले विकसित किया गया था और कई डेवलपर्स इस पर काम किया है,

कहा करने के बाद समस्या यह है कि,;

इस साइट के मोबाइल के लिए एपीआई में (रिटर्न की तुलना में सिर्फ विचारों json डेटा), कोड एक टोकन की तलाश में है, लेकिन अनुरोध के शीर्ष लेख में करता है:

token = request.META.get('HTTP_TOKEN') 

जब मैं इस एपीआई स्थानीय स्तर पर परीक्षण, ठीक काम करता है, लेकिन उत्पादन में ऐसा नहीं होता है, इसलिए, मैं यह पता लगाने की कोशिश करता हूं कि क्या हो रहा है और यह पाया गया:

डीजेंगो हेडर में परिवर्तित करता है, कस्टम हेडर भी अनुरोध में चाबियाँ। एमएमटीए, मैं परीक्षण के लिए urllib2 और requests का उपयोग करता हूं एपीआई और उत्पादन में समस्या यह है कि उत्पादन सर्वर में अनुरोध। एमटीटीए की कभी भी HTTP_TOKEN नामक कुंजी नहीं है, इसलिए, डीबग का थोड़ा सा करना उत्सुकता से सोचें कि समस्या जिस तरह से हम django अनुप्रयोग की सेवा करते हैं।

हम django1.3, nginx, gunicorn, virtualenvwrapper, python2.7 का उपयोग कर रहे हैं।

मेरा मुख्य संदिग्ध nginx है, मुझे लगता है कि, किसी भी समय nginx में हेडर प्राप्त होता है लेकिन इसे 'डीजेंगो को आगे बढ़ाएं, मैं इसके बारे में कुछ शोध करने की कोशिश करता हूं, लेकिन मुझे केवल सुरक्षा हेडर और कस्टम हेडर के बारे में जानकारी मिली है, लेकिन मुझे दस्तावेज़ या nginx को बताने के बारे में कुछ नहीं मिलता है जो उस शीर्षलेख को अनुमति देता है और इसे हटा नहीं देता है।

मुझे यहां मदद की ज़रूरत है, अगर पहली बात यह है कि nginx हेडर प्राप्त करता है, लेकिन मुझे सिर्फ nginx के बारे में कुछ पता है और मुझे नहीं पता कि अनुरोधों के शीर्षलेखों को लॉग इन करने के लिए इसे कैसे बताना है।

धन्यवाद

अद्यतन

nginx conf file

+1

आपको लगता है कि इस धारणा को साबित कर सकते हैं? Nginx और django दोनों से एक अनुरोध लॉग इन करें, और सुनिश्चित करें कि HTTP शीर्षलेखों में वास्तव में एक अंतर है। –

+0

भाग में यह समस्या है, परीक्षण में, urllib2 का उपयोग करके एक स्क्रिप्ट और अनुरोध मैं उन शीर्षकों को निश्चित करता हूं जिन्हें मैं भेजता हूं, दृश्य में मैं हेडर को प्राप्त करता हूं, डेवलपर सर्वर में, हेडर ठीक होते हैं, लेकिन उत्पादन में django प्राप्त नहीं होता है HTTP_TOKEN शीर्षलेख। – diegueus9

+0

इसके साथ में मैं nginx प्रिंट अनुरोध हेडर को कहने का एक तरीका ढूंढ रहा हूं लेकिन डॉक्टर थोड़ा भयानक है – diegueus9

उत्तर

4

Django उचित स्थान (रों) में uwsgi_pass का उपयोग कर, फिर ... पहुँचा रहा है, तो

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
uwsgi_pass_header Token; 

Django उचित स्थान (रों) में fastcgi_pass का उपयोग कर, फिर ... पहुँचा रहा है, तो

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
fastcgi_pass_header Token; 

Django उचित स्थान (रों) में proxy_pass का उपयोग कर, फिर ...

# All request headers should be passed on by default 
# but we can make sure "Token" request header is passed to Django 
proxy_set_header Token $http_token; 

# Make sure "Token" response header is passed to user 
proxy_pass_header Token; 

पहुँचा रहा है, तो ये खत्म करने में मदद करना चाहिए संभावना है कि Nginx आपके मुद्दे से चीजें पास नहीं कर रहा है।

+0

यह nginx config फ़ाइल के gunicorn के साथ है? – diegueus9

+0

मान लीजिए कि आप "गनिकोर्न या ..." का मतलब है, तो जवाब यह है कि ये nginx निर्देश हैं। ubiquitousthey आपको पहले कुछ लिंक दिया था। – Dayo

+1

एक दिलचस्प नोट पर, मुझे व्यक्तिगत रूप से शीर्षलेखों को पार करने में समस्याएं थीं जिनके नाम में uwsgi_pass_header का उपयोग करते समय अंडरस्कोर शामिल हैं। उदाहरण के लिए, ऑथोकोकन का उपयोग करते समय हेडर AUTH_TOKEN तब तक Django तक कभी नहीं पहुंच पाएगा! – stephenmuss

2

मुझे लगता है कि यह है कि तुम क्या जरूरत है:

log_format combined '$remote_addr - $remote_user [$time_local] ' 
        '"$request" $status $body_bytes_sent ' 
        '"$http_referer" "$http_user_agent" "$http_http_token" "$upstream_http_http_token"' 

लॉग इन करने की क्या हो रहा है।

आप अपस्ट्रीम प्रॉक्सी मॉड्यूल पर proxy_set_header अनुभाग में गहराई से देख सकते हैं ताकि यह देखने के लिए कि आपको आवश्यक शीर्षकों को कैसे पास किया जाए।

आप प्रलेखन यहाँ पा सकते हैं:

अंतिम प्रविष्टि कि nginx में इंगित करता है सबसे हेडर गुजरता डिफ़ॉल्ट

द्वारा
2

मुझे वास्तविक उत्तर नहीं मिला, लेकिन एक कामकाज करने में सक्षम था। मुझे आरएफसी मानक शीर्षलेखों के साथ एक ही समस्या हो रही थी, यदि कोई-मैच नहीं है और यदि संशोधित है, तो मेरा समाधान उन शीर्षकों के लिए परीक्षण किया जाता है।

मेरी nginx config करने के लिए जोड़ा गया:

uwsgi_param HTTP_IF_NONE_MATCH $http_if_none_match; 
uwsgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since; 

मैं व्याख्या नहीं कर सकते क्यों nginx डिफ़ॉल्ट रूप से uwsgi करने के लिए इन हेडर पारित करने के लिए मना कर दिया। यह विन्यास इसे मजबूर करता है। पेज अब 304 के रूप में उपयुक्त उत्पन्न करते हैं। सर्वर खंड में

uwsgi_param HTTP_TOKEN $http_token; 
3

अपने nginx विन्यास फाइल में (फ़े mysite_nginx.conf):

अमानक "टोकन" शीर्षक के बारे में मूल प्रश्न के लिए, इस चाल करना चाहिए इस पैरामीटर को जोड़ें: uwsgi_pass_request_headers on;

उदाहरण के लिए:

server { 
    # the port your site will be served on 
    listen  8000; 

    ... 

    underscores_in_headers on; 
} 

और अगर Django के लिए उपयोग uwsgi_pass माध्यम से चला जाता है, तो आप स्थान अनुभाग में इस एक पैरामीटर uwsgi_pass_request_headers on; जोड़ने की जरूरत है।

उदाहरण के लिए:

location/{ 
    include  /etc/nginx/uwsgi_params; # the uwsgi_params file you installed 
    uwsgi_pass_request_headers on; 
    uwsgi_pass django; 
} 
संबंधित मुद्दे