Фронтенд + 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
чтобы заставить его принимать соединения извне контейнера.