Невозможно настроить traefik для правильного перенаправления на Apache: слишком много перенаправлений

У меня есть приложение Django, которое используется для учета рабочего времени в моем учреждении. Он работает как контейнер Docker с веб-сервером Apache перед ним (он выполняет базовую аутентификацию HTTP с использованием LDAP, а затем перенаправляет на http://django:80/). Теперь мне нужно, чтобы Traefik был впереди всего, потому что мне нужно интегрировать Authelia вместо базовой аутентификации HTTP. Я хочу сначала протестировать все локально, поэтому это localhost.

Это мой docker-compose.yml:

version: '3'

services:

  web:
    depends_on:
      - django
      - traefik
    expose:
      - "${VIRTUAL_PORT}"
    networks:
      - default
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.chronocommand.rule=Host(`localhost`)"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.chronocommand.entrypoints=web,websecure"

  django:
    expose: 
      - "80"
    ports:
      - "8080:80"
      - "8000:8000"
      - "3000:3000"
    volumes:
      - ./Services/Chronocommand:/src
      
  traefik:
    image: "traefik:v3.0"
    ports:
      - "80:80"
      - "443:443"
      - "8888:8080"  # Traefik dashboard
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./Services/DevTraefik/:/etc/traefik

networks:
  proxy:
    external: true

это моя конфигурация траефика:

api:
  dashboard: true
  insecure: true

global:
  checkNewVersion: true
  sendAnonymousUsage: false
  
entryPoints:
  web:
    address: :80

  websecure:
    address: :443
    http:
      tls: true
  
providers:
  docker:
    exposedByDefault: false
    
  file:
      directory: /etc/traefik
      watch: true

Когда я пытаюсь получить доступ к https://localhost, я ожидаю увидеть веб-приложение django, которое работает, если я получаю к нему доступ через http://localhost:8080. Вместо этого я получаю сообщение об ошибке «слишком много перенаправлений» в своем браузере и вижу в журнале Apache, что он пытается получить доступ к серверу несколько раз. Что я сделал не так?

С вашим файлом docker-compose.yml возникли некоторые проблемы: ни у web, ни у службы django нет изображения или контекста сборки.

datawookie 23.03.2024 16:03
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
1
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я догадываюсь о многих деталях вашего проекта. Но предположим, что это выглядит примерно так:

├── docker-compose.yml
└── Services
    ├── Apache
    │   └── apache.conf
    └── Chronocommand
        ├── chrono
        │   ├── asgi.py
        │   ├── __init__.py
        │   ├── settings.py
        │   ├── urls.py
        │   └── wsgi.py
        ├── db.sqlite3
        ├── Dockerfile
        ├── manage.py
        └── requirements.txt

Содержимое приложения Django будет отличаться, но я просто создал стартовый проект Django.

🗎 docker-compose.yml (Я настраиваю Traefik напрямую здесь, а не использую отдельный файл конфигурации.)

version: '3.8'

services:
  apache:
    container_name: apache
    image: httpd:2.4
    ports:
      - "8080:8080"
    volumes:
      - ./Services/Apache/apache.conf:/usr/local/apache2/conf/httpd.conf
    depends_on:
      - django
    labels:
      - "traefik.http.routers.web.rule=Host(`localhost`)"
      - "traefik.http.services.web.loadbalancer.server.port=8080"

  django:
    container_name: django
    build:
      context: Services/Chronocommand
    ports:
      - "8000:8000"
    volumes:
      - ./Services/Chronocommand:/src
    command: python manage.py runserver 0.0.0.0:8000

  traefik:
    container_name: traefik
    image: traefik:v3.0
    ports:
      - "80:80"
      - "443:443"
      - "8888:8080"
    depends_on:
      - apache
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

🗎 apache.conf

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ServerName localhost

ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 common

LogLevel debug

User www-data
Group www-data

Listen 8080

<VirtualHost *:8080>
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://django:8000/
    ProxyPassReverse / http://django:8000/
</VirtualHost>

Вы можете протестировать следующее:

  • http://localhost:8000/ приведет непосредственно к приложению Django;
  • http://localhost:8080/ перейдет в приложение Django через Apache;
  • http://localhost будет проходить через Traefik к Apache и, следовательно, к приложению Django.

Другие вопросы по теме