होस्ट पोर्ट! कंटेनर पोर्ट पर Nginx docker मशीन पर फिर से लिखता है


10

मैं कई डॉकटर कंटेनरों को चलाने की कोशिश कर रहा हूं, जो पोर्ट 80 पर सुनने वाले सभी नगनेक्स को चला रहे हैं, लेकिन कंटेनर पोर्ट 80 को अलग-अलग होस्ट पोर्ट मैपिंग के साथ।

अधिकांश भाग के लिए यह काम करता है, सिवाय इसके कि जब नगणक्स एक अनुगामी स्लेश को याद करने के कारण पुनर्निर्देशित करता है।

server {
    listen 80;
    root /var/www;
    index index.html;
    location /docs {}
}

उपरोक्त नगीन कॉन्फिग और एक डॉकटर कंटेनर को होस्ट पोर्ट 8080 के साथ इसे चलाने के लिए कंटेनर पोर्ट 80 पर मैप किया गया है, मुझे लोकलहोस्ट मिल सकता है: 8080 / डॉक्स / कर्ल ओके के माध्यम से:

> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...

लेकिन अगर मैं लोकलहोस्ट का अनुरोध करता हूं: 8080 / डॉक्स तो मुझे लोकलहोस्ट / डॉक्स / रीडायरेक्ट मिल जाएगा

> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...

रीडायरेक्ट करते समय मूल पोर्ट को संरक्षित करने के लिए मैं कैसे नगनेक्स प्राप्त कर सकता हूं? मैंने port_in_redirect और server_name_in_redirect को देखने की कोशिश की है, लेकिन उन्होंने मदद नहीं की।


संपादित करें

Https://forum.nginx.org/read.php?2,261216,261216#msg-261216 के आधार पर यह अभी संभव नहीं दिखता है।


में देखो nginx-प्रॉक्सी कंटेनर, तो आप इस पागल बंदरगाह को फिर से लिखने कबाड़ से कोई भी कार्य करने के लिए नहीं है।
माइकल हैम्पटन

मैं वास्तव में इन कंटेनरों के सामने कुछ भी संतुलित नहीं करना चाहता। मुझे एक डॉक-कम्पोज़ फ़ाइल मिली है जो बाहरी पोर्ट को एनवी वर्जन पर आधारित करती है, और अधिकांश समय मैं सिर्फ एक बार इस फाइल को "डीकर-कम्पोज़ अप -d" करता हूं। हालांकि परीक्षण के कारणों के लिए और मुझे उन अन्य चीजों पर काम करने की अनुमति देने के लिए जिन्हें मैं "PORT = 8080 docker-compose -p test up -d" कर सकता हूं ताकि कंटेनरों का एक नया सेट तैयार किया जा सके (नए प्रोजेक्ट नाम के कारण ) जो एक अलग होस्ट पोर्ट पर मैप किए जाते हैं।
इब्रासा

एके, बस इस समस्या में भी भाग गया। मुझे लगता है कि मुझे वेनिला नेग्नेक्स जाना होगा या सामान को 8080 पर कुछ और ले जाना होगा।
केन

जवाबों:


2

सबसे सरल उपाय indexनिर्देश को हटाना है और स्पष्ट या निहित $uri/पुनर्निर्देश पर भरोसा नहीं करना है । उदाहरण के लिए:

server {
  listen 80;
  root /var/www;
  location /docs {
    try_files $uri $uri/index.html =404;
  }
}

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

server {
  listen 80;
  root /var/www;
  location /docs {
    try_files $uri @redirect;
  }
  location @redirect {
    if ($uri ~* ^(.+)/$) { rewrite ^ $uri/index.html last; }
    if (-d $document_root$uri) { return $scheme://$host:8080$uri/; }
    return 404;
  }
}

जैसा कि मैंने सवाल में कहा है कि मैंने यह कोशिश की है, मैंने port_in_redirect को बंद कर दिया; http ब्लॉक में, लोकलहोस्ट / डॉक्स / के लिए रीडायरेक्ट का एक ही परिणाम, सर्वर_name_in_redirect बंद जोड़ने की कोशिश की; भी। फिर भी लोकलहोस्ट / डॉक्स /
इबोसा

@ इबासा हाँ, इस बारे में खेद है। दो बार पढ़ें - एक बार लिखें। याद करने की कोशिश करनी चाहिए।
रिचर्ड स्मिथ

5

HTTP क्लाइंट होस्ट हेडर में पोर्ट डालेंगे। यदि आप रीडायरेक्ट करते समय होस्ट हेडर के मूल मूल्य का उपयोग करते हैं, तो इसे अपेक्षित रूप से काम करना चाहिए। मैंने निम्नलिखित कोड का परीक्षण किया और जो आपने अनुरोध किया, वह ठीक वही दिखता है:

location ~ ^.*[^/]$ {
    try_files $uri @rewrite;
}
location @rewrite {
    return 302 $scheme://$http_host$uri/;
}

> GET /bla HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.9.7
< Date: Sun, 29 Nov 2015 06:23:35 GMT
< Content-Type: text/html
< Content-Length: 160
< Connection: keep-alive
< Location: http://localhost:8080/bla/

यह तकनीकी रूप से सही उत्तर है। यह IP के साथ भी काम करता है, उदाहरण के लिए 127.0.0.1:8000 का अनुरोध 127.0.0.1:8000 http_host के रूप में होगा। ऐसा इसलिए है क्योंकि: tools.ietf.org/html/rfc2616#section-14.23 http_host को अस्पष्टता के लिए पूरा करने की आवश्यकता है, जिसमें एक पोर्ट जोड़ देगा। यदि बंदरगाहों को छोड़ दिया जाता है, तो चूक को निहित किया जाता है (जैसे या तो 80 या 443)। तो इस समाधान के साथ काम करने के लिए सबसे साफ होना चाहिए ...
जीवनरक्षक उपकरण


0

दिलचस्प ... मुझे इस मुद्दे का ठीक-ठीक सामना करना पड़ा और रिचर्ड स्मिथ के जवाब से पता चलता है कि मैं इसे ठीक कर सकता था :

root /var/www;
location = /docs {
    try_files $uri $uri/ =404;
}

एकमात्र अंतर यह है कि मैं निर्दिष्ट नहीं करता हूं index.html?

रीडायरेक्ट लूप से बचने के लिए त्रुटि कोड निर्दिष्ट करें।

अभी भी nginx के समर्थन से प्रतिक्रिया पर इंतजार कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.