Задать вопрос
@bengur2

Как запустить Nginx балансировщик, если host not found in upstream?

Делаю контейнер балансировщика.

Dockerfile:
FROM nginx:latest

COPY server.conf /etc/nginx/conf.d/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]


server.conf:
upstream bundle {
    server app;
    server fallback backup;
}

server {
    listen 80;
    server_name localhost;
    resolver 127.0.0.11;

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


Запуск:
sudo docker run --name $DOCKER_CONTAINER_NAME -d --network dev -p 80:80 $DOCKER_IMAGE_LATEST


При запуске, возникает ошибка:
nginx: [emerg] host not found in upstream "app"
  • Вопрос задан
  • 5873 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
попробуйте через переменную:
map $scheme $upstream_main {
  default app;
}

upstream bundle {
    server $upstream_main;
    server fallback backup;
}
Ответ написан
@bengur2 Автор вопроса
Есть статья:
https://www.nginx.com/blog/dns-service-discovery-n...

Там описано 5 методов для разрешения хостов.
Из них 3 метода для бесплатной версии Nginx.

В методе 2 описано использование upstream, но сервер не поднимается, если хост недоступен.
В методе 3 описано использование переменных, и сервер запустится в любом случае, но нельзя использовать upstream.

Неужели upstream и принудительный запуск - это конфликтующие хотелки?
Ответ написан
Комментировать
@IvanShatsky
У меня получилось это сделать, путём введения дополнительного слоя проксирования, так сказать "проксирования самого на себя". Вот моя конфигурация (для проверки в моей песочнице запущен DNS-сервер dnsmasq, который резолвит все домены *.localdomain в 127.0.0.1):

resolver 127.0.0.1 ipv6=off;

upstream bundle {
    server unix:/tmp/nginx-app.sock;             # заменить на "app"
    server unix:/tmp/nginx-fallback.sock backup; # заменить на "fallback"
}

server {
    listen 127.0.0.1:80;
    server_name upstream-loopback.localdomain;

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

# Второй слой проксирования
# Чтобы минимизировать накладные расходы, вместо TCP-порта слушаем UNIX-сокет

server {
    listen unix:/tmp/nginx-app.sock;
    set $backend upstream-loopback-app.localdomain;      # заменить на "app"
    location / {
        proxy_pass http://$backend;
    }
}

server {
    listen unix:/tmp/nginx-fallback.sock;
    set $backend upstream-loopback-fallback.localdomain; # заменить на "fallback"
    location / {
        proxy_pass http://$backend;
    }
}

# Эти блоки используются только для проверки того, что приведенный выше подход работоспособен

server {
    listen 127.0.0.1:80;
    server_name upstream-loopback-app.localdomain;
    return 200 "Response from the app backend\n";
}

server {
    listen 127.0.0.1:80;
    server_name upstream-loopback-fallback.localdomain;
    return 200 "Response from the fallback backend\n";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы