#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
inApache
,routing
inFlask
и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. Это сработало и для меня. Спасибо!