إنجن إكس إعادة كتابة على آلة عامل الميناء عندما المنفذ المضيف != ميناء الحاويات

أحاول تشغيل عدة حاويات عامل ميناء كل تشغيل نجينكس الاستماع على المنفذ 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 ...

كيف يمكنني الحصول على إنجن إكس للحفاظ على المنفذ الأصلي عند القيام إعادة توجيه? لقد حاولت النظر إلى المنفذ المباشر واسم الخادم لكنهم لم يساعدوا.


تحرير

بناء على https://forum.nginx.org/read.php?2,261216, 261216#جي اس-261216 هذا لا يبدو ممكنا الآن.

سيقوم عملاء هتب بوضع المنفذ في رأس المضيف. إذا كنت تستخدم القيمة الأصلية لرأس المضيف عند إجراء إعادة التوجيه ، فيجب أن تعمل كما هو متوقع. اختبرت التعليمات البرمجية التالية ويتطلع إلى أن تفعل بالضبط ما طلبته:

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/

أبسط حل هو إزالة 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;  }}

فقط اتبع هذا الإصلاح البسيط

location /app {    alias /usr/share/nginx/html/folder;    if (-d $request_filename) {        rewrite [^/]$ $scheme://$http_host$uri/ permanent;    }}

مثير للإهتمام... لقد واجهت هذه المشكلة على وجه التحديد وتمكنت من إصلاحها بقدر ما رد ريتشارد سميث يقترح:

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

والفرق الوحيد هو أنني لا تحدد index.html?

حدد رمز الخطأ لتجنب حلقة إعادة التوجيه.

لا تزال تنتظر على ردود الفعل من دعم إنجن إكس.

وأعتقد أنه يحدث منذ عامل الميناء الخاص بك هو نوع من نات/وكيل لحاوية إنجن إكس الخاص بك. للتوجيه بين مختلف المعلومات إضافة المنفذ مطلوب.

بالنسبة لي تم حل هذا إضافة ما يلي إلى إنجن إكس.أسيوط

http {    ...    proxy_set_header Host $http_host; # required for docker client's sake    proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header X-Forwarded-Proto $scheme;    ...}

أك ، ركض فقط في هذه المشكلة كذلك. أعتقد أنني سوف تضطر إلى الذهاب الفانيليا إنجن إكس أو نقل الاشياء على 8080 إلى شيء آخر.

انظر إلى [إنجن إكس-بروكسي] (GitHub - nginx-proxy/nginx-proxy: Automated nginx proxy for Docker containers using docker-gen) حاوية ، لذلك لم يكن لديك للقيام بأي من هذا المنفذ مجنون إعادة كتابة غير المرغوب فيه.

أنا لا أريد حقا أي شيء موازنة أمام هذه الحاويات. لقد حصلت على ملف عامل الميناء يؤلف الذي يحدد المنفذ الخارجي على أساس فار إنف ، ومعظم الوقت أنا فقط" عامل الميناء يؤلف حتى د " هذا الملف مرة واحدة. ولكن لأسباب الاختبار والسماح لي للعمل على أشياء أخرى أريد أن تكون قادرة على القيام “ميناء=8080 عامل الميناء-يؤلف-ف اختبار يصل د” لتدور مجموعة جديدة كاملة من الحاويات (بسبب اسم المشروع الجديد) التي يتم تعيينها إلى منفذ مضيف مختلف.