Балансировщик нагрузки / обратный прокси-сервер: «восходящий сервер временно отключен при подключении к восходящему каналу» в docker-swarm? - PullRequest
0 голосов
/ 11 октября 2019

Я использую 1 менеджер и 2 рабочих узла в Docker-Swarm.

Рабочие узлы работают с 3 стеками на сайте php / nginx, поэтому это site1, site2, site3, которые загружают «Это сайт */ (worker1 или worker2) "в браузере. Это прекрасно работает, когда я устанавливаю обратный прокси-сервер на один из узлов.

Но я хочу разместить один балансировщик нагрузки / обратный прокси-сервер на узле менеджера, я также отключил другие 2 стека, так что только в этом примереСтек site1 находится на обоих рабочих узлах. Их IP-адреса: «10.0.14.16» и «10.0.14.17».

Это файл конфигурации LB / RP nignx.

   upstream site1_nginx  {
     server 10.0.14.16;
     server 10.0.14.17;
   }
   server {
       listen 80;
       server_name site1.local;

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

       }
   }

и это файл компоновки док-станции nignx:

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

Но я получаю эту ошибку при создании службы:

loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:01 [error] 6#6: *12 no live upstreams while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://site1_nginx/", host: "site1.local"

Также, если вам нужно, конфигурация сайта site1 nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    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;
    }
}

Сети с докером в порядке, у меня есть оверлейная сеть и сеть между php и nignx.

1 Ответ

0 голосов
/ 11 октября 2019

Docker Swarm имеет собственный балансировщик нагрузки, сеть и систему DNS. Если вы хотите использовать свой собственный балансировщик, нет смысла определять IP-адреса узлов, потому что Docker также предоставляет абстракцию и управляет обнаружением службы.

Решение с IP-маршрутизацией не будет работать, как выдумаю из-за сетка маршрутизации . Все запросы сбалансированы по нагрузке без учета узла, который получает трафик. Вы можете посетить IP1, и из-за сетки маршрутизации IP2 может обработать запрос.

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

Вот так

upstream site1_nginx  {
    server site1:80;
}

site1 - это имя службы, определенное в docker-compose.yml (DNS-имя nginx равно nginx).

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

upstream site1_nginx  {
    server site1.1:80;
    server site1.2:80;
    server site1.3:80;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...