РЕДАКТИРОВАТЬ: мне нужно было указать хост как 0.0.0.0 в app.run, что решило мою проблему.
У меня есть веб-приложение, которое я пытаюсь настроить для использования докеров и компоновки докеров. Бэкенд представляет собой flask api, интерфейс — это реакцию, а nginx служит обратным прокси-сервером, каждая часть которого работает в своем собственном контейнере. Я все еще разрабатываю его, поэтому я пытаюсь использовать сервер разработки фляг для размещения приложения фляги и узел для размещения приложения реакции, с контейнером фляги, обслуживающим порт 5000, и узлом, обслуживающим порт 3000, как довольно стандартно.
Он успешно строится с помощью docker-compose -f docker-compose-dev.yml up --build, и каждый контейнер запускается. Я могу открыть локальный хост в своем браузере, который отлично загружает реагирующее приложение. Однако, когда я пытаюсь войти в систему, я получаю сообщение об ошибке неверного шлюза, что, исходя из выполненного мной поиска, означает, что nginx не может найти слушателя там, где он его ожидает.
Я пытался изменить значение proxy_pass в локации /api, но это не сработало. Нужно ли указывать IP вручную? Я пытался изменить порты в разделе flask-api моего файла docker-compose. Но и это не сработало.
Где я ошибаюсь?
Вот моя конфигурация nginx:
server {
listen 80;
location / {
proxy_pass http://client:3000;
proxy_redirect default;
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_set_header X-Forwarded-Host $server_name;
}
location /api {
proxy_pass http://flask-api:5000;
proxy_redirect default;
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_set_header X-Forwarded-Host $server_name;
}
}
И вот файл компоновки:
version: '3'
services:
flask-api:
image: flask-translate
build:
context: ./flask_back_end/
dockerfile: Dockerfile-dev
volumes:
- "./flask_back_end/:/app"
ports:
- 5000:5000
client:
image: react-translate
build:
context: ./react-app/
dockerfile: Dockerfile-dev
ports:
- 3000:3000
depends_on:
- flask-api
volumes:
- './env.json:/usr/src/app/src/env.json'
nginx:
image: nginx-translate
build:
context: ./nginx/
dockerfile: Dockerfile-dev
ports:
- 80:80
depends_on:
- flask-api
- client
И когда я запускаю контейнеры, фляжный сервер дает мне знать, что он работает http://127.0.0.1:5000/
Если я попытаюсь войти в систему, nginx выдает ошибку
[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "POST /api/user/login HTTP/1.1", upstream: "http://172.18.0.2:5000/api/user/login", host: "localhost", referrer: "http://localhost/"
вместо ожидаемой переадресации соединения на API-сервер разработки фляги.
Из этого сообщения об ошибке я думаю, что клиент (то есть 172.18.01) отправляет почтовый запрос на localhost/api/user/login, который пытается перенаправить его на 172.18.02:5000/api/user/login, но слушателя там нет, поэтому в соединении отказано.
@jakks0 Добро пожаловать в Stack Overflow! «Повторяющиеся» вопросы обычно должны быть закрыто как таковые, чтобы избежать распространения полезных ответов на сайте. Для некоторых вопросов это нормальный жизненный цикл, и я думаю, что этот подходит под эту категорию. Тем не менее, вопросы, закрытые как повторяющиеся, может быть полезно сохранить здесь, потому что это может помочь некоторым людям найти решение, используя другие условия поиска. Просто чтобы вы знали, в настоящее время сообщество голосует за его закрытие, но я думаю, что у вас должна быть какая-то кнопка для ускорения процесса в верхней части вашего вопроса (не уверен).
Моя репутация настолько низка, что кнопка не появляется (похоже, чтобы она появилась, вам нужен представитель 250).


Каким-то образом я не смог найти этот пост в своих поисках, спасибо за ссылку, это решило мою проблему. Указание хоста в качестве
app.run('host=0.0.0.0'), по-видимому, является причиной проблемы. Спасибо! Учитывая, что это похоже на дубликат, я не уверен, что смогу пометить комментарий как ответ. Если вы опубликуете это как ответ, я сделаю это.