Nginx, fastapi и streamlit в докере — обратный прокси-сервер не работает для streamlit

#python #docker #fastapi #nginx-reverse-proxy #streamlit

Вопрос:

я хочу использовать docker для контейнеризации приложений nginx, fastapi и 2 потоковых приложений. Все 3 приложения (fastapi, 2streamlit приложения) не взаимодействуют друг с другом. Nginx должен работать в качестве обратного прокси-сервера для 3 приложений. Для fastapi это работает. Я могу отправлять запросы rest-api на http://ip:80/twxservices . «twxservices» в качестве конечной точки добавляется в app.py файл, а не в nginxconfig.

Приложения с потоковым освещением недоступны через это http://ip:80/stream1 и http://ip:80/stream2 Я получаю ошибку: 404: Не найден

Заранее спасибо за вашу помощь. Найдите ниже структуры файлов и файлы конфигурации. Это файловая структура и то, как должен работать обратный прокси:

введите описание изображения здесь введите описание изображения здесь

docker-создать файл:

  services:  web:  build:  context: ./nginxfolder  dockerfile: Dockerfile  container_name: web    ports:  - 80:80  networks:  - my-network  depends_on:  - app   app:  build:  context: ./twxservicesfolder  dockerfile: Dockerfile  container_name: app    networks:  - my-network    spectrum:  build:  context: ./spectrumfolder  dockerfile: Dockerfile  container_name: spectrum   networks:  - my-network    dgraph:  build:  context: ./dgraphfolder  dockerfile: Dockerfile  container_name: dgraph   networks:  - my-network   networks:  my-network:  driver: bridge   

nginx config (default.conf):

 upstream fastapi-backend {  server app:8000; }     server {  listen 80;     location / {  proxy_pass http://fastapi-backend;    proxy_set_header Host $http_host;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header X-Forwarded-Proto $scheme;      proxy_redirect off;  proxy_buffering off;  client_body_buffer_size 100M;  client_max_body_size 100M;  }    location /stream1 {  proxy_pass http://spectrum:8501/stream1;  }  location ^~ /stream1/static {  proxy_pass http://spectrum:8501/stream1/static/;  }  location ^~ /stream1/healthz {  proxy_pass http://spectrum:8501/stream1/healthz;  }  location ^~ /stream1/vendor {  proxy_pass http://spectrum:8501/stream1/vendor;  }  location /stream1/spectrum {  proxy_pass http://spectrum:8501/stream1/spectrum;  proxy_http_version 1.1;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header Host $host;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection "upgrade";  proxy_read_timeout 86400;  }    location /stream2 {  proxy_pass http://dgraph:8503/stream2;  }  location ^~ /stream2/static {  proxy_pass http://dgraph:8503/stream2/static/;  }  location ^~ /stream2/healthz {  proxy_pass http://dgraph:8503/stream2/healthz;  }  location ^~ /stream2/vendor {  proxy_pass http://dgraph:8503/stream2/vendor;  }  location /stream2/dgraph {  proxy_pass http://dgraph:8503/stream2/dgraph;  proxy_http_version 1.1;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header Host $host;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection "upgrade";  proxy_read_timeout 86400;  }   }  

Контейнер Dockerfile nginx:

 FROM nginx:latest  RUN rm /etc/nginx/conf.d/default.conf COPY default.conf /etc/nginx/conf.d  

Контейнер dgraph приложения Dockerfile с потоковым освещением:

 FROM python:3.8  COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt  EXPOSE 8503 COPY app2.py /var/dashboard/app2.py CMD streamlit run /var/dashboard/app2.py --server.address="0.0.0.0" --server.port="8503"   

Контейнер спектра приложения Dockerfile с потоковым освещением:

 FROM python:3.8  COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt  EXPOSE 8501 COPY app1.py /var/dashboard/app1.py CMD streamlit run /var/dashboard/app1.py --server.address="0.0.0.0" --server.port="8501"   

Контейнер twxservices приложения Dockerfile fastapi:

 FROM python:3.8-slim-buster  COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . .  ENV PYTHONUNBUFFERED 1  EXPOSE 8000 CMD ["uvicorn","app:app","--proxy-headers","--host","0.0.0.0","--forwarded-allow-ips","*"]  

Комментарии:

1. может location / быть, это должно быть последним правилом.

2. ты знаешь, почему так должно быть?

3. Я не уверен, должно ли это быть последним, но многие инструменты (т. Е. virtual_host in Apache , routing in Flask и Django ) получают первое совпадающее местоположение/маршрутизацию. Я не уверен, что location / метод сравнения как if / == http://ip:80/stream2: или if / in http://ip:80/stream2: но с in может совпадать со всеми URL-адресами, а также http://ip:80/stream1 и http://ip:80/stream2 может совпадать с location / , и он может запускать неправильное приложение. Я бы добавил самый короткий location в качестве последнего. И самый длинный в начале.

4. Я попробовал это и переместил местоположение / fastapi до конца, но это не помогло. По-прежнему появляется ошибка 404: Не найдено

5. вы можете подключиться напрямую http://spectrum:8501/stream1 ? Может быть, так и должно быть без stream1 http://spectrum:8501/

Ответ №1:

Я заставил его работать с этими конфигурациями nginx

 location /spectrum {  proxy_pass http://spectrum1:8501/spectrum;  proxy_http_version 1.1;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header Host $host;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection "upgrade";  proxy_read_timeout 86400;  }  

и эта конфигурация файла Dockerfile для приложения streamlit:

 FROM python:3.8 COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt  EXPOSE 8501 COPY app1.py /var/dashboard/app1.py CMD streamlit run /var/dashboard/app1.py --server.address="0.0.0.0" --server.port="8501" --server.baseUrlPath="spectrum" --server.enableCORS=false --server.enableXsrfProtection=false  

Комментарии:

1. Это сработало и для меня. Спасибо!