меня запускается 2 контейнера - nginx и registry. И теперь попал в странную ситуацию - для работы nginx нужен сервис gateway, а чтобы запустить сервис gateway нужно скачать его из registry 🤷 Подскажите, как можно решить это? Запустить еще один nginx?
Зачем нужен gateway не совсем понятно. У Вас уже есть nginx и registry для полноценной работы докер-режистри. Это, конечно при условии, что nginx в работает как прокси и у него соответствующий конфиг есть для работы с registry.
gateway будет ловить gql-запросы и перенаправлять их в rabbit, а когда все сервисы ответят, собирать их ответы в один и отправлять клиенту
по сути nginx нужен только для registry, но он занимает 443 порт поэтому и gateway придётся за него убрать
Вы там с архитектурой разберитесь и отделите мух (приложеньки) от котлет (базовая инфраструктура). Никто не мешает использовать один прокси (nginx) для разных задач. Конфиги нужны только соответствующие.
не понял. Вот есть у меня registry, который спрятан за nginx на домене registry.mysite.ru А домен mysite.ru должен обращаться к gateway. Всё. На это вся инфраструктура заканчивается. Куда там и что будет делать gateway - не мои проблемы, моя задача сделать так, чтобы gateway был доступен на 443 порту домена mysite.ru Можно тогда разнести домены mysite.ru и registry.mysite.ru по разным физическим серверам и в принципе это решит проблему, но держать отдельный физический сервер для одного единственного контейнера - так себе идея
Почему бы и нет?
если gateway спрятать за nginx, то nginx не сможет запуститься так как при чтении своего конфига получит ошибку "хост недоступен". А чтобы запустить gateway, нужно его скачать из registry, которые недоступен, пока nginx лежит. В общем скорее всего придётся все-таки поднимать gateway на отдельном сервере и тогда получится что на одном сервере будет registry + nginx, а на втором только gateway
Можно и зайца научить курить. Но зачем? Заверните трафик на один прокси (nginx) и настройте его, чтобы он проксировал запросы к нужным ресурсам.
Можно просто нормально настроить нджинкс
он должен отправлять все запросы на gateway. ну или может есть какой-то способ заставить nginx общаться напрямую с rabbitmq, дожидаться ответа всех сервисов и собирать из них единый ответ? Если такой способ есть я с радостью выкину этот gateway. А еще gateway отвечает за push-уведомления и за SSE
что я и пытаюсь сделать =)
Так и не нагуглил, как запустить nginx при unreachable upstream?
А вот про это я как раз и писал, что нужно отделить мух от котлет. У Вас должны быть слои сервисов: инфраструктурный и прикладной (приложения). И они должны жить и запускаться параллельно.
там из решений типа "подождать несколько секунд, пока нужный сервис не запуститься и попробовать снова. А нужный сервис не запустится пока registry недоступен
Это понятно, не понятно как поделить 443 порт между gateway и nginx если они на одном сервере =)
Не мешайте все в кучу. Разделите.
то есть выделить под реестр отдельный физический сервер?
вот и я о том же =)
Нет. Регистри с прокси сначала запускать, а потом уже приложения.
Но сделать можно, если понимать, что nginx должен проксировать запросы.
у меня так и настроено ` docker compose --env-file .env --profile registry up --build -d docker compose --env-file .env --profile gateway up --build -d docker compose --env-file .env --profile services up --build ` Но nginx падает с ошибкой "gateway недоступен"
Про то, как заставить nginx запуститься без доступного upstream Вам уже сказали.
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; } По умолчанию запросы распределяются по серверам циклически (в режиме round-robin) с учётом весов серверов. В вышеприведённом примере каждые 7 запросов будут распределены так: 5 запросов на backend1.example.com и по одному запросу на второй и третий серверы. Если при попытке работы с сервером происходит ошибка, то запрос передаётся следующему серверу, и так далее до тех пор, пока не будут опробованы все работающие серверы. Если не удастся получить успешный ответ ни от одного из серверов, то клиенту будет возвращён результат работы с последним сервером. То есть nginx всё так же продолжит падать
в моём случае этот конфиг выглядел вот так upstream backend { server gateway:8080 max_fails=10 fail_timeout=30s; } а дальше уже server { listen 443 ssl default_server; http2 on; location / { proxy_pass http://gateway; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; }
Должен быть proxy_pass http://backend;
да пробовал еще вчера =(
И какую ошибку Nginx выдает?
docker compose up падает с ошибкой "https://register.mysite.ru/v2/": dial tcp *.*.*.*:443: connect: connection refused а nginx ругается в логах host not found in upstream "gateway:8080"
вот конф для mysite у registry.mysite другой конфиг в отдельном файле
"https://register.mysite.ru/v2/": dial tcp *.*.*.*:443: connect: connection refused А 443 порт на хосте никем не используется?
кроме nginx никем
Обсуждают сегодня