2012-02-21 16 views
5

के पीछे एक पिरामिड सर्वर में क्लाइंट का वास्तविक आईपी कैसे प्राप्त करें मेरे पास एक पिरामिड एप्लिकेशन है जो कुछ स्थानों पर request.environ['REMOTE_ADDR'] का उपयोग करता है।किसी nginx प्रॉक्सी

आवेदन पोर्ट 6543 पर पायथन पेस्ट द्वारा परोसा जाता है और पोर्ट 80 पर एक nginx सर्वर सुनना पेस्ट सर्वर को अनुरोध अग्रेषित कर रहा है।

nginx विन्यास पिरामिड रसोई की किताब से प्रेरित है:

server { 

    listen 80; ## listen for ipv4 
    listen [::]:80 default ipv6only=on; ## listen for ipv6 

    server_name localhost; 

    access_log /var/log/nginx/localhost.access.log; 

    location/{ 

     proxy_set_header  Host $host; 
     proxy_set_header  X-Real-IP $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header  X-Forwarded-Proto $scheme; 
     proxy_pass http://127.0.0.1:6543; 

    } 

पिरामिड आवेदन में चर request.environ [ 'REMOTE_ADDR'] अब हमेशा 127.0.0.1 के बराबर है। मैं इस समस्या को हल करने के लिए कुछ रणनीतियों को देखता हूं लेकिन मुझे नहीं पता कि ऐसा करने के लिए एक अनुशंसित तरीका है या नहीं।

if 'HTTP_X_REAL_IP' in event.request.environ: event.request.environ['REMOTE_ADDR'] = event.request.environ['HTTP_X_REAL_IP']

  • एक WSGI मिडलवेयर का उपयोग करें:

    • एक NewRequest ग्राहक जो request.environ की जगह [ 'REMOTE_ADDR'] यदि आवश्यक जोड़ें:

      यहाँ मैं क्या कर रहा हूँ पर विचार है पिरामिड परत को मारने से पहले request.en वातावरण को संशोधित करने के लिए।

    • कुछ और

    कौन सा रणनीति आप पिरामिड अनुप्रयोगों को विस्तृत करने के लिए प्रयोग करते हैं? यदि मेरे पास दो nginx प्रॉक्सी है तो क्या होगा? (पहली बार लैन की सेवा करता है और दूसरा एक मशीन सीधे इंटरनेट से जुड़ा हुआ है)।

  • उत्तर

    6

    है पाइपलाइन use = egg:PasteDeploy#prefix के माध्यम से, यह स्वचालित रूप से X-Forwarded-For को REMOTE_ADDR में अनुवादित करेगा। यह आपके रिवर्स प्रॉक्सी के अन्य गुणों के लिए भी बहुत अच्छा है, उदाहरण के लिए यह X-Forwarded-Proto को wsgi.url_scheme में अनुवाद करने के लिए अनुवाद करेगा ताकि यह सुनिश्चित किया जा सके कि यदि उपयोगकर्ता https के साथ जाता है तो जेनरेट किए गए यूआरएल भी https होते हैं।

    http://pythonpaste.org/deploy/class-paste.deploy.config.PrefixMiddleware.html

    +0

    मुझे कुछ याद करना होगा क्योंकि मैंने पहली बार पकवान पुस्तिका में सुझाए गए प्रीफिक्स मिडलवेयर के साथ प्रयास किया था लेकिन यह काम नहीं करता था। मुझे मोटे तौर पर इसे फिर से प्रयास करने की ज़रूरत है। – ascobol

    +0

    ठीक है यह पता चला है कि मैं [पाइपलाइन: मुख्य] ​​अनुभाग डालने के लिए भूल गया। सब कुछ ठीक काम करता है – ascobol

    -2
    nginx में

    :

    location/{ 
        proxy_pass http://yourapp; 
         proxy_redirect  off; 
         proxy_set_header Host    $host; 
         proxy_set_header X-Real-IP  $remote_addr; 
         proxy_set_header X-Forwarded-For $remote_addr; 
         } 
    
    php में

    मैं करना: यदि आप अपने WSGI में paste.deploy.config.PrefixMiddleware का उपयोग करते हैं

     if($_SERVER["HTTP_X_FORWARDED_FOR"]){ 
         $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
        }else{ 
         $ip = $_SERVER["REMOTE_ADDR"]; 
         } 
    
    अजगर में

    शायद इसी तरह की है, $ आईपी अपने असली आईपी

    2

    मैं nginx पीछे gevent सर्वर का उपयोग और मैं request.client_addr का प्रयोग कर एक क्लाइंट का IP पता प्राप्त करने के लिए।

    config.add_subscriber(reverseProxyProtocolCorrection,'pyramid.events.NewRequest') 
    

    ईवेंट हैंडलर की तरह पढ़ सकते हैं::

    1

    आप एक WSGI pipline नहीं है, तो, या paste का उपयोग नहीं करना चाहते हैं, तो एक ईवेंट हैंडलर जोड़ने

    def reverseProxyProtocolCorrection(event): 
        event.request.scheme = 'https' if event.request.headers['X-Forwarded-Proto']=='https' else 'http' 
        event.request.remote_addr=parseXForward(event.request.headers['X-Forwarded-For'],event.request.remote_addr) 
    

    और बनाने सुनिश्चित करें कि आपका प्रॉक्सी हेडर सेट करता है

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