Игнорировать доступность сервиса во время запуска nginx в Docker Swarm - PullRequest
0 голосов
/ 23 октября 2019

Приложение состоит из нескольких сервисов, перед которыми мы используем nginx в качестве веб-сервера. И мы развернем все эти сервисы, включая nginx, в docker swarm.

docker-compose.yaml:

version: '3'
services:
  sa:
    image: xx.com/service-a
  sb:
    image: xx.com/service-b
  sc:
    image: xx.com/service-c
  ....
  gateway:
    image: nginx
    volumes:
      - /nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
  overlay:

nginx.conf:

  location / {
    proxy_pass http://sa;
  }

  location /sb/ {
    proxy_pass http://sb;
  }

  location /sc/ {
    proxy_pass http://sc;
  }
  ......

Пока что такхорошо, однако, когда запускается стек и если одна из служб (скажем, sc) не запускается, это также приведет к невозможности запуска nginx, что делает наше приложение недоступным.

Кажетсянапример, встроенный dns-сервер от docker не может разрешить хост sc, поскольку он еще не запущен.

Мы не хотим, чтобы один сервис влиял на все приложение, и звучит так, как это можно описатькак другой вопрос: «как позволить nginx игнорировать доступность апстрима / прокси во время запуска». Пока после поиска нет решения. Есть идеи?

1 Ответ

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

Вы можете отложить разрешение DNS, пока оно вам не понадобится. Поэтому nginx может перезапуститься без разрешения dns.

вы должны использовать переменную в вашей директиве proxy_pass.

...
set $backend "http://serviceD" ;
proxy_pass $backend;
...

Так что я смог смоделировать вашу проблему с этим docker-compose.yaml иПосле default.conf

в образе nginx распознаватель по умолчанию указывает на 127.0.0.11

resolver 127.0.0.11 valid=30s;
resolver_timeout 5s;

server {
listen 0.0.0.0:80;
server_name localhost;

location / {
    proxy_pass http://serviceA;
}

location /sd/ {
    set $backend "http://serviceD" ;
    proxy_pass $backend;
}

}


version: '3.7'
services:
  serviceA:
    image: debian:stretch-slim
    command: ["sleep","3600" ]
  serviceD:
    image: debian:stretch-slim
    command: ["sleep","3600" ]
  nginx:
    image: nginx
    volumes:
      - ${PWD}/default.conf:/etc/nginx/conf.d/default.conf:ro
    command: ["/bin/sh","-c","exec nginx -g 'daemon off;'"]
    restart: always
    ports:
      - target: 80
        published: 8080
        protocol: tcp
        mode: host
  testD:
    image: alpine:latest
    restart: always
    command: ["/bin/sh","-c","( apk add --no-cache bind-tools && host serviceD && ping -c 8 -i 4 serviceD )" ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...