Intro
Я создаю веб-приложение, используя последнюю версию Django вместе с python3.7.Приложение докернизировано, и я планирую развернуть его с помощью docker-compose.Внутри контейнера я использую nginx для прокси трафика к приложению, а не выставляю его напрямую.Кроме того, я использую apache на уровне сервера для прокси-трафика к различным другим контейнерам, размещенным на той же машине.
В приложении Django я использую oauth2 для аутентификации в Fitbit Web API, и проблема, с которой я сталкиваюсь, заключается в том, что django-social-auth автоматически передает имя хоста как redirect_uri
который теперь, после большого количества настроек со всеми этими прокси, отлично работает в HTTP, но когда я использую HTTPS, хотя приложение обычно отвечает, redirect_uri
по-прежнему http
, что явно не разрешено fitbit и очень рискованно.
Хотя мне очень трудно определить, на каком уровне возникает проблема, я пробовал разные вещи, но ничего не получается.
То, что я пробовал
Первый
Я пытался заставить мой контейнер прослушивать запрос https, который казался мне наиболее подходящим решением, но прекратил получать 502 ошибки от Apache.Я попытался найти решение по этому вопросу, добавив некоторую конфигурацию в файл виртуального хоста, например
#Solution 1
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://localhost:83/ Keepalive=On #Solution 2 (keep alive)
ProxyPassReverse / https://localhost:83
Но, наконец, я обнаружил, что это не проблема apache, но что nginx внутри контейнера не былотвечая, хотя трафик был перенаправлен на порт 443 с использованием HTTPS
Second
Я пытался перенаправить трафик с HTTPS для Apache на HTTP-контейнером nginx (, который не имеет для меня особого смысла)), что заставляет приложение реагировать нормально, но приводит к ошибке redirect_uri
, о которой я упоминал выше
Как вы можете видеть, я более или менее сбит с толку, и любые советы или подсказки могут быть очень полезны
Обновление 1
Конфигурация nginx, запрошенная в комментариях
server {
listen 80;
listen 443 default_server ssl;
server_name localhost;
charset utf-8;
location /static {
alias /app/static/;
}
location /upload {
alias /app/media/;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}