Nginx + Docker - "нет прямых каналов при подключении к восходящему каналу" с восходящим потоком, но отлично работает с proxy_pass - PullRequest
0 голосов
/ 17 марта 2020

Итак, я столкнулся со странной проблемой, и я не уверен, в чем причина. Я запускаю контейнер, используя docker -compose, и отлично работает следующая конфигурация nginx:

server {
  location / {
        proxy_pass http://container_name1:1337;
  }
}

Где container_name - это имя службы, которую я дал в docker -compose.yml файл. Он отлично разрешает IP и работает. Однако в тот момент, когда я изменяю вышеуказанный файл на этот:

upstream backend {
    least_conn;
    server container_name1:1337;
    server container_name2:1337;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

Он перестает работать полностью, и в журналах ошибок я получаю следующее:

2020/03/17 13:16:03 [error] 8#8: *11 no live upstreams while connecting to upstream, client: xxxxxx, server: codedamn.com, request: "GET /HTTP/1.1", upstream: "http://backend/", host: "xxxxx"

Почему это так? nginx не может разрешить DNS, когда находится внутри вышестоящих блоков? Может ли кто-нибудь помочь с этой проблемой?

ПРИМЕЧАНИЕ. Это происходит только в производственной среде (Ubuntu 16.04), в локальной сети (macOS Catalina), та же конфигурация работает нормально. Я совершенно сбит с толку после обнаружения этого.

Обновление 1: Следующие работы:

upstream backend {
    least_conn;
    server container_name1:1337;
}

Но не с более чем одним сервером. Почему?!

1 Ответ

0 голосов
/ 17 марта 2020

Хорошо. Догадаться. Это связано с тем, что docker-compose случайным образом создает константы, а nginx быстро помечает контейнеры как down (я развертывал это на производстве, когда было некоторое количество трафика c). Контейнеры приложения не были готовы, но nginx был, поэтому он разметил их и прекратил пересылку любых траффиков c.

На данный момент, вместо синхронизации docker-compose порядка создания контейнера (который был немного хакерский, как я обнаружил), я отключил неудачные попытки nginx автоматически пометить службу как отключенную, написав:

server app_inst1:1337 max_fails=0;

, что позволяет nginx по-прежнему пересылать трафик c в определенный сервис (и мой docker настроен на перезапуск контейнера в случае его сбоя), что нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...