2015-08-25 14 views
8

के पीछे nginx के पीछे रेल के लिए X-Forwarded-Proto मैं इस बात के साथ कुछ घंटों तक अटक गया हूं। कोई रास्ता नहीं मैं इसे काम कर सकता है। मैंने सब कुछ करने की कोशिश की जो मैं सोच सकता हूं और/या ऑनलाइन पाया।ईएलबी

तो, मेरा आवेदन ईएलबी (वेब) की ओर इशारा किया गया है। ईएलबी 80 और 443 सुनता है और 80 उदाहरण (एसएसएल को यहां समाप्त कर दिया जाता है) सदस्य उदाहरण (ओं) में भेजता है जो nginx है।

कई उदाहरणों के सामने Nginx प्रॉक्सी ऐप अनुरोध अन्य ईएलबी (ऐप) के लिए अनुरोध करता है। ये उदाहरण प्यूमा चलाते हैं।

https योजना के साथ, जब मैं किसी URL पर जाने का प्रयास करता हूं (जहां मैंने उस नियंत्रक के लिए force_ssl का उपयोग किया था) को छोड़कर सब कुछ ठीक काम करता है, मुझे रीडायरेक्शन लूप मिलता है। (जाहिर है app_name ansible द्वारा प्रतिस्थापित हो जाता है।)

यहाँ मेरी nginx कॉन्फ़िगरेशन

location @{{app_name}} { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_redirect off; 
    proxy_pass http://{{app_name}}; 
    # limit_req zone=one; 
    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 
    } 

की तरह लग रही है

$scheme के बजाय

, मैं https और $proxy_add_x_forwarded_proto हार्डकोड करने की कोशिश की, लेकिन कोई भी मेरे लिए काम किया। मुझे अभी भी लूप मिलता है।

फिर मैंने रेल में env का निरीक्षण करना शुरू किया और मुझे nginx config में सेट हेडर के बावजूद निम्न मान दिखाई देते हैं।

"SERVER_PROTOCOL"=>"HTTP/1.1", 
"HTTP_X_FORWARDED_PROTO"=>"http", 
"rack.url_scheme"=>"http", 

मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं। किसी भी मदद की सराहना की! नोट: मैंने पहले से ही सभी पाया एसओ धागे की जांच की है और कोई भी मदद नहीं की!

+0

ठीक है, मेरे पास नई जानकारी है।यदि मैं ऐप ईएलबी के बजाय सीधे nginx से अनुरोधों को प्रॉक्सी करता हूं, तो मुझे लगता है कि सबकुछ पूरी तरह से काम कर रहा है ('" HTTP_X_FORWARDED_PROTO "=>" https ", रेल में)। तो, इसका मतलब है कि ईएलबी उस हेडर को अलग कर रहा है। क्या यह उस तथ्य से संबंधित हो सकता है कि ऐप ईएलबी 80 तक सुनता है और 8080 भेजता है और यही कारण है कि उस हेडर को अलग करना? – HungryCoder

उत्तर

0

मुझे एक समाधान मिला जो काम करता है (हालांकि मुझे यकीन नहीं है कि यह सही है)।

ELB Listener Settings

तो अगर मैं सेटअप टीसीपी श्रोता 8080 पर: 8080 और nginx के नदी के ऊपर सेटिंग से ऐसा उपयोग करते हैं, सब कुछ ठीक काम कर रहा है। इसका मतलब है कि web उदाहरण टीसीपी 8080 पर app ईएलबी से कनेक्ट हो रहे हैं। मुझे लगता है कि एक्स-फॉरवर्ड-प्रोटो सही ढंग से पारित हो गया है।

मैं भी इस ईएलबी के रूप में 80 के लिए श्रोता जोड़ दिया है CloudFront के मूल जो 80

+1

बस सही लाइन रिकॉर्ड करने के लिए 'proxy_set_header एक्स-फॉरवर्डेड-प्रोटो $ http_x_forwarded_proto; ' – HungryCoder

0

को जोड़ता है एसएसएल के मामले में ऑफलोड यह सादे HTTP (80) के माध्यम से संवाद करने के लिए समझ में आता है के रूप में इस्तेमाल किया है और कर रहा है रेल समायोजित config :

config/वातावरण/production.rb

config.force_ssl = false 

यह एक पुनर्निर्देशन पाश से बचने के लिए मदद करता है और HTTPS आंतरिक रूप से उपयोग कभी नहीं लोड संतुलन और आवेदन के Nginx सर्वर के बीच।

तुम भी उल्लेख किया:

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

HTTPS हर जगह का उपयोग करें वेबसाइट पर और ईएलबी परत पर अनुप्रेषित 80-> 443 के लिए force_ssl इस्तेमाल किया।

+0

प्रॉक्सी और ऐप सर्वर के बीच कोई एसएसएल संचार नहीं है (यह पहले ही ईएलबी पर समाप्त हो चुका है)। लेकिन जब उपयोगकर्ता एक https यूआरएल पर जा रहा है और जब नहीं, तो हमें (ऐप से) पता होना चाहिए। मैं आपके सुझाव और पोस्ट की सराहना करता हूं लेकिन यह हमारे उपयोग के मामलों में नहीं है और मुझे नहीं लगता कि मैं जो हासिल करने की कोशिश कर रहा हूं वह तकनीकी रूप से असंभव है! – HungryCoder

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