2015-10-19 4 views
6

हल करें मैं मिलान पथ उपसर्ग को हटाते समय proxy_pass का उपयोग कर किसी अन्य सर्वर से अनुरोध को प्रॉक्सी करना चाहता हूं। मेरा मानना ​​है कि ऐसा करने का एक तरीका निम्नानुसार है;एनजीआईएनएक्स proxy_pass पथ उपसर्ग को हटाएं और DNS

location /a/ { 
    proxy_pass https://website.com/ 
} 

उदा। http://localhost/a/b.html पर एक अनुरोध https://website.com/b.html पर प्रॉक्सी किया जाएगा।

जहां तक ​​मुझे पता है कि एनजीआईएनएक्स पर गैर-वाणिज्यिक संस्करणों में इस मुद्दे के साथ समस्या यह है कि website.com के लिए DNS ए रिकॉर्ड लोड हो जाएगा और स्टार्टअप पर हमेशा के लिए कैश किया जाएगा। मैंने proxy_pass निर्देश में $request_uri जैसे चर का उपयोग करके इसे हल करने के लिए एक तकनीक देखी है, इस प्रकार रिकॉर्ड के टीटीएल के अनुसार DNS को फिर से हल करने के लिए एनजीआईएनएक्स को मजबूर कर रहा है।

उदा।

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$request_uri 
} 

दुर्भाग्य से, ऐसा लगता है के रूप में यह अभी भी नदी के ऊपर करने के लिए/एक/उपसर्ग पारित करने के लिए लगता है कि इसके बाद के संस्करण काम नहीं करता।

अनिवार्य रूप से मैं यहां हासिल करना चाहता हूं, पथ उपसर्ग को इस तरह से हटाते हुए अनुरोध को प्रॉक्सी करना है कि DNS रिकॉर्ड्स हमेशा के लिए कैश नहीं किए जाते हैं।

धन्यवाद।

उत्तर

11

मुझे यकीन नहीं है कि आपने इसे कहाँ देखा है, लेकिन विशेष रूप से $request_uri का उपयोग करके जादुई रूप से जादुई रूप से आपके लिए डोमेन नामों को गतिशील रूप से हल करने के लिए नहीं जा रहा है।

शायद सुझाव दिया गया था कि $uri (जो कि एक अलग चर है), स्पष्ट रूप से चर का उपयोग कर रहा था, इस धारणा पर कि जब चर उपयोग में हैं, तो किसी भी कैशिंग के बिना डोमेन नाम प्रत्येक बार व्यक्तिगत रूप से हल किया जाता है? मैं पुष्टि नहीं करता हूं कि इस तरह की धारणा सही है या नहीं, लेकिन निम्नलिखित कम से कम /a से छुटकारा पाएंगी।

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$uri$is_args$args; 
} 

(ध्यान दें कि यदि यह वास्तव में डोमेन नाम कैश करने के लिए लागू नहीं किया है, तो आप के रूप में अच्छी तरह से एक स्थानीय समाधानकर्ता, अतिरिक्त विलंबता और अपने होस्टिंग प्रदाता के DNS के अन्तराल को चलाने के लिए, नहीं तो तुरंत अपनी साइट को प्रभावित करेगा चाहते हो सकता है , नहीं अपने सर्वर के संभावित DNS क्वेरी सीमा का उल्लेख।)


शायद एक बेहतर समाधान समय-समय पर nginx पुनः आरंभ करने के लिए स्वचालित रूप से डीएनएस में परिवर्तन लेने के लिए हो सकता है? उदा।, nginx -s reload या kill -HUP? जैसा कि http://nginx.org/en/docs/beginners_guide.html#control और http://nginx.org/en/docs/control.html#reconfiguration में बताया गया है, nginx रीलोड के दौरान किसी भी अनुरोध को संसाधित नहीं करता है, इसलिए यह एक सुरक्षित संचालन होना चाहिए; और यह संभवतया डीएनएस में फंसने के परिणामस्वरूप भी होगा।

+0

आपके उत्तर के लिए धन्यवाद, मैं आज इसका परीक्षण करूंगा और यदि यह ठीक काम करता है तो मैं इस उत्तर को स्वीकार कर दूंगा। मुझे संकल्प के बारे में पिछली सलाह मिली [यहां] (http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers)। मुझे पूरा भरोसा है कि जब तक डीएनएस को हल करने के लिए इसका "इरादा" प्रभाव पड़ा, क्योंकि इसके बिना पहले अपस्ट्रीम विश्वसनीय रूप से हर कुछ दिनों में उपलब्ध नहीं होगा और मुझे फिर से शुरू करने की आवश्यकता होगी। मैंने इसे 3 महीने से अधिक समय तक चालू नहीं किया है, बिना किसी पुनरारंभ के और मुझे उस परिवर्तन के बाद से किसी भी DNS समस्या का सामना नहीं हुआ है। –

+0

ओह, हाँ, अगर nginx सभी होस्टनामों के 5 मिनट के लिए कैश रखता है तो यह proxy_pass के भीतर किसी भी चर के अस्तित्व में हल होता है, जो समझ में आता है; यह वास्तव में उस तरह से दस्तावेज भी है, लेकिन यह बहुत स्पष्ट नहीं है! हर दिन सीखो! :-) इसलिए, मुझे लगता है कि उपर्युक्त काम करना चाहिए, और आपको '.com' के बाद '/' को भी हटा देना चाहिए, उदाहरण के लिए, होना चाहिए।कॉम $ uri' – cnst

+0

तो प्रारंभिक परीक्षण आपके मूल सुझाव 'पुनः लिखना ^/a /(.*)/$ 1 ब्रेक के साथ ठीक काम करने लगते हैं; proxy_pass https://website.com/$uri$is_args$args;) 'लेकिन' .com $ uri' के साथ ठीक नहीं है (क्वेरी पैरामीटर अपस्ट्रीम के लिए प्रचारित नहीं हैं। मैं पहले सुझाव के साथ रहूंगा। धन्यवाद जवाब के लिए! –

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