सवाल रिवर्सप्रोक्सिंग करते समय अपस्ट्रीम के होस्टनाम को पास करने के लिए nginx बनाएं


मैं मेजबाननाम के साथ कई डॉकर कंटेनर चलाता हूं:

web1.local web2.local web3.local

Nginx द्वारा होस्टनाम के आधार पर किए गए इन पर रूटिंग। मेरे पास इस सेटअप के सामने प्रॉक्सी है (इंटरनेट से जुड़ी विभिन्न मशीनों पर) जहां मैं अपस्ट्रीम को परिभाषित करता हूं:

    upstream main {
      server web1.local:80;
      server web2.local:80;
      server web3.local:80;
    }

और वास्तविक वर्चुअल होस्ट विवरण:

    server {
      listen 80;
      server_name example.com;
      location / {
        proxy_pass http://main;
      }
    }

अब, क्योंकि कंटेनर को "web1.local" के बजाय होस्टनाम "मुख्य" मिलता है, वे अनुरोध के लिए ठीक से प्रतिक्रिया नहीं देते हैं।

प्रश्न: होस्ट में सर्वर के अपस्ट्रीम समूह के नाम के बजाय अपस्ट्रीम सर्वर के नाम को पास करने के लिए मैं nginx को कैसे बता सकता हूं: अनुरोध करते समय हेडर?


71
2018-05-23 20:46


मूल


मुझे नहीं लगता कि आप कर सकते हैं। मुख्य या example.com का जवाब देने के लिए आप अपने बैकएंड सर्वर क्यों सेट नहीं करते हैं? ऐसा नहीं है कि बैकएंड नहीं जानता कि कौन यह है। रिवर्स आसानी से संभव है: proxy_set_header होस्ट $ होस्ट; मूल अनुरोध से होस्टनाम के साथ अपस्ट्रीम से वापस आने वाले किसी होस्ट होस्ट को प्रतिस्थापित कर देगा। - Andrew Domaszek
आवेदन को ठीक करना उचित बात है। - Michael Hampton♦


जवाब:


असल में आप proxy_set_header के माध्यम से ऐसा कर सकते हैं।

अधिक जानकारी के लिए यहां देखें: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header या यहां एक उदाहरण उपयोग-केस देखें: https://stackoverflow.com/questions/12847771/configure-nginx-with-proxy-pass

मैंने आपके उपरोक्त पोस्ट कॉन्फ़िगरेशन में गतिशील दृष्टिकोण शामिल किया है:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

स्थिर होस्ट नाम के साथ यहां एक उदाहरण दिया गया है:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            www.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

88
2018-05-24 08:10



proxy_set_header एक्स-फॉरवर्डेड- $ proxy_add_x_forwarded_for के लिए; बेहतर लगता है - sivann
@ पावेल: इसे मिला। असल में मैंने कुछ शोध और कुछ परीक्षण भी किए। ऐसा लगता है कि आपकी आवश्यकता को पूरा करने के लिए कोई सीधा दृष्टिकोण नहीं है। तो यहां तक ​​कि एक "bastardized" समाधान भी एक समाधान है। मैं यह नहीं पूछना चाहता कि आप ऐसा क्यों करना चाहते हैं। मुझे यकीन है कि आपके पास कारण हैं। :-) - Jens Bradler
@ जेन्सब्राडलर आप मुझसे ज्यादा विशेषज्ञ लगते हैं, क्या आप मुझे बता सकते हैं कि आप मेरे समाधान के बारे में क्या सोचते हैं? मैं वही करना चाहता हूं क्योंकि मैं अपनी आईएसपी पर दो खातों से अपनी वेबसाइट की दो प्रतियां चलाता हूं: site1.myisp.com तथा site2.myisp.com और वे केवल अपने संबंधित नाम का जवाब देते हैं। मैं, अब, मेरे डोमेन नाम का मालिक हूं और मैं अपने सर्वर को बैलेंस लोड करने के लिए अपनी आईएसपी वेबसाइट का उपयोग करना चाहता हूं। क्या यह एक अच्छा कारण नहीं है? आपका बहुत बहुत धन्यवाद ;) - ncenerar
@ncenerar आप ऐसा कर सकते हैं लेकिन यह आपको विफलता के एक बिंदु पर लाएगा: लोड बैलेंसर। यदि यह लोड संतुलन (अनावश्यकता नहीं) के लिए है तो आप DNS फेलओवर के साथ संयोजन में DNS आधारित भार संतुलन का भी उपयोग कर सकते हैं। - Jens Bradler
यह जवाब दर्शाता है आधिकारिक ब्लॉग की सलाह। - Bernard Rosset


मुझे एक ही समस्या थी और अंततः प्रॉक्सी के दो स्तरों का उपयोग करके इसे हल किया। यहां बताया गया है कि आप अपनी स्थिति के लिए कैसे कर सकते हैं (मुझे लगता है):

server {
  listen      8001 default_server;
  server_name web1.example.com;
  location / {
    proxy_pass       http://web1.local:80;
    proxy_set_header Host web1.local:80;
  }
}

server {
  listen      8002 default_server;
  server_name web2.example.com;
  location / {
    proxy_pass       http://web2.local:80;
    proxy_set_header Host web2.local:80;
  }
}

server {
  listen      8003 default_server;
  server_name web3.example.com;
  location / {
    proxy_pass       http://web3.local:80;
    proxy_set_header Host web3.local:80;
  }
}

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen      80;
  server_name example.com;
  location / {
    proxy_pass http://main;
  }
}

जैसा कि आप देख सकते हैं, यह चाल एक स्थानीय सर्वर को किसी विशेष पोर्ट का जवाब देना है जो प्रत्येक सर्वर के लिए सही होस्ट को फिर से लिखकर सर्वर को प्रॉक्सी करेगा। फिर, आप अपने स्थानीय सर्वरों को अपने अपस्ट्रीम में उपयोग कर सकते हैं और अंत में उस प्रॉस्ट्रीम को वास्तविक प्रॉक्सी में उपयोग कर सकते हैं।


21
2017-08-20 15:20



मैंने मूल रूप से लुआ दृष्टिकोण का उपयोग किया, लेकिन अब पूरी तरह से हैप्रोक्सी में स्विच किया गया जो मानक विन्यास के साथ जो कुछ भी चाहता था वह करने की अनुमति देता है। - pavel_karoukin


तो nginx के लिए सभी दस्तावेज पढ़ने से (मैं वास्तव में अपस्ट्रीम मॉड्यूल के लिए कोड पार्स नहीं कर सका = () मैं इस बेस्टर्डिज्ड समाधान के साथ आया था। दुर्भाग्य से यह समाधान विफल मेजबानों का ट्रैक नहीं रखता है, लेकिन बस यादृच्छिक एक का चयन करें और इसके लिए अनुरोध को पुनर्निर्देशित करें। तो मुझे यह सुनिश्चित करने के लिए कि सभी बैकएंड चल रहे हैं, किसी प्रकार की निगरानी स्थापित करनी है।

server {
        listen 80;
        server_name example.com;
        resolver 127.0.0.1;

        location / {
                set $upstream "";
                rewrite_by_lua '
                        local upstreams = {
                                "http://web1.dokku.localdomain",
                                "http://web2.dokku.localdomain",
                                "http://web3.dokku.localdomain",
                                "http://web4.dokku.localdomain"
                        }
                        ngx.var.upstream = upstreams[ math.random( #upstreams ) ] 
                ';
                proxy_pass $upstream;
        }
}

2
2018-05-24 13:39





हम अपस्ट्रीम एडीआर में इस तरह के एक अलग हेडर के रूप में पास करते हैं

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Upstream      $upstream_addr;
  }
}

अगर आपने कोशिश की तो क्या होगा?

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $upstream_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Host          $host;
  }
}

2
2018-04-26 17:49





जबकि लक्ष्य तार्किक लगता है, nginx होस्ट को बदलने वाला नहीं है: अपस्ट्रीम से मिलान करने के लिए हेडर। इसके बजाए, यह व्यवहार करता है upstream एक जैसे डोमेन नाम CNAME DNS में - एक आईपी पते पर जाने के लिए एक तरीका के रूप में।

अपस्ट्रीम का चयन करने से पहले अनुरोध हेडर (और बॉडी) तय किए जाते हैं। अपस्ट्रीम मिड-अनुरोध बदल सकता है अगर यह एक विशेष अपस्ट्रीम गैर-प्रतिक्रियाशील पाया जाता है, लेकिन अनुरोध नहीं बदलता है।


1
2018-06-23 01:06