2009-10-26 19 views
9

का उपयोग करके Django को नहीं भेजा जा रहा है इसलिए मुझे स्थिर मीडिया के लिए nginx के साथ एक सरल सेटअप और लोड संतुलन और टर्ननाडो को django (4 सर्वर चलने) के लिए वेबसर्वर के रूप में लोड किया गया।REMOTE_ADDR nginx और tornado

article.ip = request.META['REMOTE_ADDR']

दूरदराज के पते के रूप में एक्स-वास्तविक आईपी (HTTP_X_REAL_IP) nginx.conf करने के लिए धन्यवाद के माध्यम से भेजा जा रहा है: मेरी समस्या REMOTE_ADDR django के लिए तो मैं एक KeyError हो रही है पर पारित नहीं किया जा रहा है:

location/{ 
     proxy_pass_header Server; 
     proxy_set_header Host $http_host; 
     proxy_redirect false; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Scheme $scheme; 
     proxy_pass http://frontends; 
    } 

HTTP के रूप में मेटा कुंजी मैं सिर्फ ऐसा नहीं कर सकते proxy_set_header REMOTE_ADDR $ REMOTE_ADDR के लिए prepended है। यदि मैं कोई रिमोट एडीआर कुंजी नहीं पाता हूं तो मैं एक्स-रीयल-आईपी पढ़ सकता हूं लेकिन अगर कोई स्मार्ट समाधान है तो मैं उत्सुक हूं।

धन्यवाद!

+0

यह कोई सही समाधान है, लेकिन मैं एक Django मिडलवेयर चला कि जोड़ा HTTP_X_REAL_IP REMOTE_ADDR में। – Nixarn

+0

ये कथन आपको मदद करेंगे: proxy_redirect बंद; proxy_set_header एक्स-रीयल-आईपी $ remote_addr; \t \t proxy_set_header एक्स-फॉरवर्डेड- $ proxy_add_x_forwarded_for के लिए; \t \t proxy_set_header एक्स-स्कीम $ योजना; – glarrain

उत्तर

11

इस एक का प्रयास करें:

location/{ 
    proxy_pass http://frontends; 
    proxy_pass_header Server; 
    proxy_redirect off; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme $scheme; 
    proxy_set_header REMOTE_ADDR $remote_addr; 
} 

बस proxy_set_header REMOTE_ADDR जोड़ सकते हैं और यह काम अच्छी तरह से किया जाना चाहिए।

साथ की कोशिश की:

  • Django 1.5.4
  • Nginx 1.4.3
  • तूफान 2.2.1
+0

अनुसार इस: https: //easyengine.io/tutorials/nginx/forwarding-visitors-real-ip/ बैकएंड-nginx conf अंदर: स्थान ~ \ .php $ { fastcgi_param REMOTE_ADDR $ http_x_real_ip; # ... अन्य नियम } – Amini

5

मेरे पास एक समान सेटअप है। अपाचे के सामने nginx डालने के बाद, मैंने देखा कि अपाचे लॉग में आईपी हमेशा 127.0.0.1 था। "Libapache2-mod-rpaf" को संस्थापित करना इसे ठीक करना प्रतीत होता था। मुझे कोई जानकारी नहीं है कि आपकी समस्या से संबंधित है या नहीं।

+0

आह धन्यवाद, लेकिन मैं इस परियोजना के लिए बिल्कुल अपाचे का उपयोग नहीं कर रहा हूं। – Nixarn

+0

ओह, ज़ाहिर है, उस उत्तर के बारे में क्षमा करें – asciitaxi

+0

आपके उत्तर के लिए धन्यवाद। बीटीडब्लू: यह PHP सॉफ़्टवेयर में भी मदद करता है, जो $ _SERVER ['REMOTE_ADDR'] पर निर्भर करता है जिसमें अब वास्तविक रिमोट आईपी भी शामिल है। – Leif

0

नहीं, यह not possible पर दूरस्थ_addr पर जाने के लिए है। तो मुझे पता है कि एकमात्र समाधान एक्स-रीयल-आईपी या एक्स-फॉरवर्ड-फॉर का उपयोग करना है और यह सुनिश्चित करना है कि बैकएंड इन्हें सही तरीके से संभालता है।

संपादित करें: इस fastcgi_pass पर लागू होता है, नहीं नियमित nginx proxy_pass

+0

संभव नहीं है? @ जुंडे का समाधान मेरे लिए बहुत अच्छा काम करता है। –

+0

एक fastcgi हैंडलर के लिए, हाँ। लेकिन सवाल एक nginx प्रॉक्सी के बारे में था। – windyjonas

+1

ओह, मुझे करीब पढ़ना चाहिए था -'proxy_pass' 'fastcgi_pass' नहीं है। मैं अपने डाउनवोट को तब तक रद्द नहीं कर सकता जब तक कि आप अपना उत्तर स्पष्ट रूप से संपादित नहीं करते। :/यदि आप इसे संपादित करना चाहते थे, तो मुझे इसके बजाय ऊपर उठाने में खुशी होगी। –

14

यहाँ कैसे मैं समस्या हल है। इस मिडलवेयर का उपयोग करके:

class SetRemoteAddrMiddleware(object): 
    def process_request(self, request): 
     if not request.META.has_key('REMOTE_ADDR'): 
      try: 
       request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP'] 
      except: 
       request.META['REMOTE_ADDR'] = '1.1.1.1' # This will place a valid IP in REMOTE_ADDR but this shouldn't happen 

आशा है कि मदद करता है!

+2

इसके साथ केवल समस्या यह है कि यदि आप चुपचाप त्रुटि को छोड़ देते हैं तो आप पाएंगे कि गलत तरीके से गलत सर्वर (बाद में खोई गई जानकारी या उपयोगकर्ता लॉग इन करने में असमर्थ हैं)। मेरा सुझाव असफल होना होगा या कम से कम त्रुटि को लॉग करना होगा। –

+2

लगभग हमेशा, आप 'कोशिश/छोड़ना नहीं चाहते': बिना अपवाद प्रकार के CPython 2.x में, क्योंकि यह सिस्टमएक्सिट, कीबोर्ड इंटरप्ट और जेनरेटर एक्सीट भी पकड़ लेगा - ये सभी प्रकार की त्रुटियां हैं जिन्हें आप बेहतर छोड़ते हैं या इन में दुर्लभ मामलों, उन्हें अलग से पकड़ो। विशेष रूप से इस मामले में, किसी को KeyError पकड़ना चाहिए। लेकिन फिर आप इस कोड को और भी सरल बना सकते हैं: 'request.META.setdefault ('REMOTE_ADDR', request.META.get ('HTTP_X_REAL_IP', '1.1.1.1'))' – temoto

+0

अच्छा समाधान लेकिन ध्यान में रखना है _key() पायथन 3.x में हटा दिया गया था। उपयोग करें: अनुरोध नहीं है .META.get ('REMOTE_ADDR', कोई नहीं): – Robert

5

"fastcgi_param REMOTE_ADDR $ remote_addr जोड़ें" nginx.conf फाइल करने के लिए:

location/{ 
    # host and port to fastcgi server 
    fastcgi_pass 127.0.0.1:8801; 
    fastcgi_param PATH_INFO $fastcgi_script_name; 
    fastcgi_param REQUEST_METHOD $request_method; 
    fastcgi_param QUERY_STRING $query_string; 
    fastcgi_param CONTENT_TYPE $content_type; 
    fastcgi_param CONTENT_LENGTH $content_length; 
    fastcgi_pass_header Authorization; 
    fastcgi_intercept_errors off; 
    ... 
    # Add this line! 
    fastcgi_param REMOTE_ADDR $remote_addr; 
    ... 
} 

स्रोत: how to nginx virtual servers + fcgi for django?

+0

यह 'fastcgi_pass' (धन्यवाद!) के लिए बहुत अच्छा काम करता है, लेकिन यह 'proxy_pass' के लिए काम नहीं करेगा, जो ओपी का सेटअप है (देखें @ विन्दजोनास का जवाब)। –

+1

कैसे - 'fastcgi_param REMOTE_ADDR $ http_x_real_ip;'? यदि एक्स-रीयल-आईपी nginx के लिए उपलब्ध है, तो इसे fastcgi_param के रूप में पास-ऑन करने के लिए उपयोग किया जा सकता है। इससे एप्लिकेशन स्रोत कोड में बदलाव करने की आवश्यकता खत्म हो जाएगी। – rahul286

2

मेरे लिए, का उपयोग करते हुए निम्न काम किया:

server { 
    listen 80; 
    server_name foo.bar.com; 
    location/{ 
     proxy_pass http://127.0.0.1:8000; 
     proxy_set_header X-Forwarded-For $remote_addr; 
    } 
} 

यह Django 1.4 (विशेष रूप से, localshop) के साथ काम करता है।