111: رفض الاتصال وكيل إنجن إكس لحاويات عامل الميناء

  • سينتوس 7

لدي بسيطة إنجن إكس وكيل دوكر الحاويات الاستماع على المنفذ 80. هنا هو دوكيرفيل:

FROM centos:7MAINTAINER Brian Ogden# Not currently being used but may come in handyARG ENVIRONMENTRUN yum -y update && \    yum clean all && \    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \    yum -y makecache && \    yum -y install nginx-1.12.0 wget# Cleanup some default NGINX configuration files we don’t needRUN rm -f /etc/nginx/conf.d/default.confCOPY /conf/proxy.conf /etc/nginx/conf.d/proxy.confCOPY /conf/nginx.conf /etc/nginx/nginx.confCMD ["nginx"]

ولهذا الوكيل إنجن إكس هنا هو بلدي إنجن إكس.أسيوط:

daemon off;user  nginx;worker_processes  2;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;events {    worker_connections  1024;    use epoll;    accept_mutex off;}http {    include       /etc/nginx/mime.types;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    access_log  /var/log/nginx/access.log  main;    sendfile        on;    #tcp_nopush     on;    keepalive_timeout  65;    client_max_body_size 300m;    client_body_buffer_size 300k;    large_client_header_buffers 8 64k;    gzip  on;    gzip_http_version 1.0;    gzip_comp_level 6;    gzip_min_length 0;    gzip_buffers 16 8k;    gzip_proxied any;    gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;    gzip_disable "MSIE [1-6]\.";    gzip_vary on;    include /etc/nginx/conf.d/*.conf;}

وهنا هو تكوين الوكيل الخاص بي:

upstream accountstaging {    server 127.0.0.1:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        proxy_redirect     off;        proxy_set_header   Host $host;        proxy_set_header   X-Real-IP $remote_addr;        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header   X-Forwarded-Host $server_name;    }}

تكوين الوكيل الخاص بي يستمع على المنفذ 80 ويحاول طلب طلبات من account.staging.mysite.com إلى حاوية عامل ميناء تعمل على نفس المضيف عامل ميناء كما وكيل نغنيكس الاستماع على المنفذ 5023.

هنا هو بلدي عامل الميناء يؤلف.يمل لبلدي نجينكس الوكيل:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"

هنا هو عامل الميناء يؤلف.يمل لهذه الحاوية عامل الميناء الاستماع على المنفذ 5023: الإصدار:'3'

services:  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "127.0.0.1:5023:80"

و دوكيرفيل لا يهم حقا الكثير لسؤالي ولكن هنا هو على أي حال:

FROM tsl.devops.dotnetcore.base.image:2MAINTAINER Brian OgdenWORKDIR /appCOPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .ENTRYPOINT ["dotnet", "Tsl.Example.dll"]

تابعت هذا المثال لإعداد وكيل بلدي.

لقد سألت سابقا سؤال ذات الصلة على منتديات ستاككسشانج هنا و هنا. هذا السؤال لقد صقل وتبسيط السيناريو إلى وكيل ببساطة إعادة توجيه طلب إلى حاوية عامل ميناء واحد الاستماع على المنفذ 5023.

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

بفضل هذا سؤال وجواب هنا, كنت قادرا على إدراك أن لدي مشكلتين مستمرتين:

  1. تحتوي الحاويات على شبكات مرافئ افتراضية مختلفة لأنني أستخدم اثنين من مرافئ مختلفة.ملفات يمل ، كنت قد تصور بلدي وكيل نغنيكس تعمل بشكل مستقل عن أي من حاويات أبي بلدي تماما ، بما في ذلك عامل الميناء يؤلف ، أكثر على هذه المسألة أدناه
  2. المسألة الثانية هي ببساطة عندما حاولت وكيل إلى 127.0.0.1:5023 وهذا هو لوكالهوست داخل حاوية نغنيكس ، وليس الشبكة خارج حاوية وكيل نجينكس

وبالتالي فإن الشبكات الافتراضية المختلفة التي يتم إنشاؤها بواسطة عامل الميناء يؤلف لبلدي نجينكس وكيل عامل الميناء الحاويات و أبي حاوية عامل الميناء هي لأنني مسلية اثنين مختلفة عامل الميناء يؤلف.ملفات يمل. وذلك لأن لدي جنكينز يبني للعديد من الخدمات المصغرة أبي حتى يكون لديك ملفات عامل ميناء مستقل وأنا في حاجة إلى وكيل نجينكس لإعادة توجيه الطلبات على المنفذ 80 إلى كل ميكروسرفيس.

لاختبار هذا ، إنشاء عامل ميناء يؤلف.يمل لكل من الحاويات ، أبي وكيل نجينكس:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/nginxproxy/docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "5023:5023"    environment:       ASPNETCORE_URLS: http://+:5023

نعم كان لا يزال هناك مشكلة ، تمرير الوكيل إلى هتب//:127.0.0.1:5023 ، أن الأمام لا يزال في حاوية نجينكس دوكر وأبدا يجد أبي يعمل على المضيف دوكر ، أنا ببساطة بحاجة إلى استخدام عامل الميناء يؤلف.اسم خدمة يمل للوصول إليه:

upstream accountstaging {    server apistaging:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        proxy_redirect     off;        proxy_set_header   Host $host;        proxy_set_header   X-Real-IP $remote_addr;        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header   X-Forwarded-Host $server_name;    }}

كان لي هذه المشكلة ولكن كانت مشكلتي أن كان لي مجلدين أن كلا كان عامل الميناء يؤلف.ملفات يمل التي كان على حد سواء خدمة تسمى 'ويب'. لقد غيرت اسم إحدى الخدمات.

الصورة الكاملة لمساعدة شخص يكافح مع شبكات عامل الميناء بقدر ما كنت (صباحا?):

غالبا ما تستخدم مشاريع إنشاء عامل الميناء نجينكس كخادم عكسي لتوجيه حركة مرور هتب إلى خدمات عامل الميناء الأخرى. كان إنجن إكس خدمة في بلدي projectfolder/docker-compose.yml الذي كان متصلا شبكتين عامل الميناء.

واحد كان الشبكة الافتراضية التي تم إنشاؤها عندما كنت عامل الميناء-يؤلف على projectfolder/docker-compose.yml (يدعى projectfolder_default والخدمات الاتصال به افتراضيا إلا إذا كان لديك networks خاصية لخدمتك مع شبكة أخرى ، ثم تأكد من إضافة - default إلى القائمة). عندما ركضت docker network ls رأيت projectfolder_default في القائمة وعندما ركضت docker network inspect projectfolder_default رأيت حاوية إنجن إكس ، لذلك كان كل شيء جيدا.

كان الآخر عبارة عن شبكة تسمى my_custom_network أن أقوم بإعداد نفسي. كان لدي برنامج نصي لبدء التشغيل أنشأه إذا لم يكن موجودا باستخدام https://stackoverflow.com/a/53052379/13815107 أنا في حاجة إليها من أجل التحدث مع web الخدمة في otherproject/docker-compose.yml. كنت قد أضفت بشكل صحيح my_custom_network إلى:

  • nginx قائمة شبكات الخدمة projectfolder/docker-compose.yml
  • الجزء السفلي من projectfolder/docker-compose.yml
  • web شبكات الخدمة في otherproject/docker-compose.yml
  • الجزء السفلي من otherproject/docker-compose.yml

ظهرت الشبكة وكان لديها الحاويات المناسبة باستخدام docker network ls و docker network inspect my_custom_network

ومع ذلك, افترضت أن الاتصال http://web سوف خريطة لخدمة عامل الميناء web.projectfolder_default. كنت مخطئا. فتحت قذيفة على حاوية إنجن إكس (docker exec -it nginx sh). عندما كنت ping web (قد تحتاج إلى apt-get update, apt-get install iputils-ping) نجحت ، لكنها طبعت عنوان ورل مع my_custom_network وهي الطريقة التي اكتشفت بها الخطأ.

بروجيكتفولدر / عامل الميناء-يؤلف.يمل

  services:    # http://web did NOT map to this service!! Use http://web.main_default or change the names    web:      ...     nginx:        ...      links:        - web      networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

أوثيربروجيكت / عامل الميناء-يؤلف.يمل

  services:    # http://web connected to this service instead. You could use http://web.my_custom_network to call it out instead    web:      ...       networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

بروجيكتفولدر/.../ إنجن إكس / الخادم.أسيوط.قالب (بجانب دوكيرفيل)...

server {    ...    location /auth {        internal;        # This routed to wrong 'web'        proxy_pass              http://web:9001;        proxy_pass_request_body off;        proxy_set_header        Content-Length "";    }    location / {        alias /data/dist/;    }    location /robots.txt {        alias /robots.txt;    }    # Project Folder backend    location ~ ^/(api|login|logout)/ {        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_connect_timeout 300s;        proxy_read_timeout 300s;        # This routed to wrong 'web'        proxy_pass http://web:9001;    }    # Other project UI    location /other-project {        alias /data/other-project-client/dist/;    }    # Other project Django server    location ~ ^/other-project/(rest)/ {        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_connect_timeout 300s;        proxy_read_timeout 300s;        # This should work        proxy_pass http://web.my_custom_network:8000;    }}