Фронтенд + NGINX не могут сделать запрос к конечным точкам бэкенда (2 разных контейнера docker)

У меня проблемы с выполнением запросов к внутреннему контейнеру Django из внешнего приложения, которое обратно проксируется NGINX.

У меня есть внутренний сервер Django, который обслуживает информацию базы данных, проводит аутентификацию и т.д. Он контейнеризирован через контейнер docker. Он локально обслуживается на http://127.0.0.1:8000/. Затем у меня есть NGINX project.conf следующим образом:

server {

listen 80;
server_name docker_flask_gunicorn_nginx;

location / {
    proxy_pass http://my_app:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /static {
    rewrite ^/static(.*) /$1 break;
    root /static;
}}

В приложении backend есть несколько различных конечных точек, но оно терпит неудачу на первом препятствии, которое заключается в попытке аутентификации на /api/token/. Когда внешнее приложение делает запрос к http://127.0.0.1:8000/api/token/, возвращается следующая ошибка:

HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: /api/token/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc3208f6910>: Failed to establish a new connection: [Errno 111] Connection refused'))

Для полноты картины docker-compose для установки фронтенда / NGINX выглядит так:

version: '3'

services:

  my_app:
    container_name: my_app-frontend
    restart: always
    build: ./my_app
    ports:
      - "8080:8080"
    command: gunicorn -w 2 -b :8080 app:server
    env_file:
      - ./my_app/.env


  nginx:
    container_name: nginx
    restart: always
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - my_app

Из того, что я могу видеть на контейнере Django, запрос никогда не принимается бэкендом, а когда я запускаю приложение фронтенда без NGINX, оно работает как ожидалось. Таким образом, я предполагаю, что это проблема с настройкой NGINX. Я просмотрел существующие вопросы и некоторые из них выглядят похожими, однако я попробовал предложенные решения и не смог заставить их работать. Например, я попробовал изменить API url, чтобы он указывал на ip-адрес моста docker, но это тоже не помогло. Прошу прощения, если на этот вопрос уже отвечали, но любая помощь будет принята с благодарностью!

Спасибо!

По умолчанию IP-адрес, к которому привязывается gunicorn, равен 127.0.0.1, что означает, что он будет принимать соединения только изнутри контейнера.

Использовать

command: gunicorn -w 2 -b 0.0.0.0:8080 app:server

чтобы заставить его принимать соединения извне контейнера.

Вернуться на верх