Невозможно проксировать Shiny с помощью Django и Nginx (код ответа HHTP 101)
Я пытаюсь использовать Nginx и Django для обслуживания Shiny-приложений на внутренних серверах моей компании. Сначала я тестирую все локально, чтобы убедиться, что все работает правильно. Я следую двум руководствам:
- https://pawamoy.github.io/posts/django-auth-server-for-shiny/#proxying-shiny-requests-to-the-shiny-app
- https://testdriven.io/dockerizing-django-with-postgres-gunicorn-and-nginx
Я начал с поста testdrive.io для настройки Django и Nginx, а затем объединил идеи с постом pawamoy для настройки части Shiny. Окончательная настройка:
- Приложение Django прослушивается на 8000
- Shiny на 8100
- Nginx - 1337 (согласно учебнику testdriven.io).
Мой конечный файл nginx conf
выглядит следующим образом:
upstream django_app {
server web:8000;
}
upstream shinyapp_server {
server shiny:8100;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name localhost;
client_max_body_size 100M;
location / {
proxy_pass http://django_app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
# proxy_pass http://django_app;
if (!-f $request_filename) {
proxy_pass http://django_app;
break;
}
}
location /static/ {
alias /home/app/web/staticfiles/;
}
location /media/ {
alias /home/app/web/mediafiles/;
}
location ~ /shiny/.+ {
# auth_request /auth;
rewrite ^/shiny/(.*)$ /$1 break;
proxy_pass http://shinyapp_server;
proxy_redirect http://shinyapp_server/ $scheme://$host/shiny/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 20d;
proxy_buffering off;
}
# location = /auth {
# internal;
# proxy_pass http://django_app/shiny_auth/;
# proxy_pass_request_body off;
# proxy_set_header Content-Length "";
# proxy_set_header X-Original-URI $request_uri;
# }
}
Я создаю изображения с помощью следующего композитного файла:
version: '3.8'
services:
web:
build:
context: ./app
dockerfile: Dockerfile.prod
command: gunicorn django_app.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/home/app/web/staticfiles
- media_volume:/home/app/web/mediafiles
expose:
- 8000
env_file:
- ./.env.prod
depends_on:
- db
db:
image: postgres:13.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- ./.env.prod.db
nginx:
build: ./nginx
volumes:
- static_volume:/home/app/web/staticfiles
- media_volume:/home/app/web/mediafiles
ports:
- 1337:80
depends_on:
- web
- shiny
links:
- web
- shiny
shiny:
build:
context: ./shinyapp
dockerfile: Dockerfile.shiny
expose:
- 8100
volumes:
postgres_data:
static_volume:
media_volume:
Мой views.py
файл:
def shiny(request):
return render(request, 'django_app/shiny.html')
def shiny_contents(request):
response = requests.get('http://shiny:8100')
soup = BeautifulSoup(response.content, 'html.parser')
return JsonResponse({'html_contents': str(soup)})
Все работает хорошо до момента обслуживания содержимого Shiny на localhost:1337/shiny
, однако, при попытке использовать прокси запросы на localhost/shiny
, я получаю следующее сообщение в логах:
172.20.0.1 - - [08/Feb/2023:15:42:52 +0000] "GET /shiny/websocket/ HTTP/1.1" 101 31668 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" "-"
Содержимое Shiny отображается хорошо и правильно, но я не могу правильно настроить проксирование по нужному адресу, т.е. не уверен, что прокси работает так, как ожидалось.
Как определить, что это проблема брандмауэра?
Правильно ли я сопоставляю порты и серверы?
Нужно ли что-то делать с
/etc/nginx/sites-available
?Если мне удастся правильно все настроить, поможет ли размещение этого на удаленном сервере создать внутреннюю связь для взаимодействия людей с приложениями?
Большое спасибо за любые соображения или комментарии. Илан
Здесь есть другие сообщения с подобными проблемами, которые я попытался воспроизвести на своей стороне безрезультатно.