Невозможно проксировать Shiny с помощью Django и Nginx (код ответа HHTP 101)

Я пытаюсь использовать Nginx и Django для обслуживания Shiny-приложений на внутренних серверах моей компании. Сначала я тестирую все локально, чтобы убедиться, что все работает правильно. Я следую двум руководствам:

Я начал с поста 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" "-"

Вот здесь я застрял: enter image description here

Содержимое Shiny отображается хорошо и правильно, но я не могу правильно настроить проксирование по нужному адресу, т.е. не уверен, что прокси работает так, как ожидалось.

  • Как определить, что это проблема брандмауэра?

  • Правильно ли я сопоставляю порты и серверы?

  • Нужно ли что-то делать с /etc/nginx/sites-available?

  • Если мне удастся правильно все настроить, поможет ли размещение этого на удаленном сервере создать внутреннюю связь для взаимодействия людей с приложениями?

Большое спасибо за любые соображения или комментарии. Илан

Здесь есть другие сообщения с подобными проблемами, которые я попытался воспроизвести на своей стороне безрезультатно.

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