Служба обратного прокси на узле менеджера: «узел не найден в восходящем потоке», но работает, если такая же служба находится на рабочем узле - PullRequest
0 голосов
/ 15 октября 2019

Я использую Docker Swarm с 1 менеджером и 2 рабочими узлами (виртуальные машины Centos). Каждый рабочий узел имеет 1 стек, в котором есть служба nginx и php, которые загружают «Это сайт1» в браузере.

Сайт будет загружен, только если у рабочего узла есть обратный прокси-сервер (но он всегда подключаетсяв стек на том рабочем узле, который является частью проблемы), но если я запустил службу на узле менеджера, у которого нет стека nginx / php, он не будет автоматически направлен на стеки на рабочих узлах, даже если я создаловерлейная сеть «reprox», к которой подключен стек и обратный прокси.

docker-compose.yml для стека:

version: '3'

services:
  nginx:
      image: nginx:latest
      deploy:
        placement: 
          constraints: 
            - node.role==worker
        mode: global 
      volumes:
          - "./code:/code"
          - "./site.conf:/etc/nginx/conf.d/site.conf"
      networks:
          - site1
          - reprox
  php:
      image: php:7-fpm
      deploy:
        placement: 
          constraints: 
            - node.role==worker
        mode: global      
      volumes:
          - "./code:/code"
      networks:
        - site1

networks:
  reprox:
    external: true 
  site1:

docker-compose.yml для обратного прокси (Когда я запускаю этот сервис на рабочих узлах, он работает, набрав site1.local в браузере, который указан в моем / etc / hosts как IP-адрес узла):

version: '3'

services:
  nginx:
      image: nginx:latest
      deploy:
        placement: 
          constraints: 
            - node.role==manager
        mode: global
      ports:
          - "80:80"
      volumes:
          - "./conf.d/:/etc/nginx/conf.d"

      networks:
          - reprox
networks:
  reprox:
    external: true

conf.d / site1Конфигурация .conf для обратного прокси:

    server {
    listen 80;
        server_name site1.local;

        location / {
            proxy_pass http://site1_nginx;
            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;
        }
    }

также site.conf для стека:

server {
    listen *:80;
    index index.php index.html;
    server_name site1.local;
    resolver 127.0.0.11;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /code;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        set $upstream php:9000;        
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Я получаю эту ошибку при запуске обратного прокси на менеджере:

nginx: [emerg] host not found in upstream "site1_nginx" in /etc/nginx/conf.d/site1.conf:6

Мне это нужнотак что я могу балансировать нагрузки между стеками, я также добавлю другие стеки, которые будут загружать разные сайты, поэтому мне нужен обратный прокси.

Я знаю, что могу добавить отдельный балансировщик нагрузки на каждый узел, который будетперенаправление на обратные прокси на этих узлах, но это слишком много накладных расходов. Обратный прокси-сервер должен автоматически подключаться к доступным стекам в рое, поэтому я создал оверлейную сеть.

...