无法配置 traefik 以正确重定向到 apache:重定向太多

问题描述 投票:0回答:1

我有一个 Django 应用程序,用于在我的机构进行时间跟踪。它作为 Docker 容器运行,前面有一个 Apache Web 服务器(它使用 LDAP 进行 HTTP 基本身份验证,然后重定向到 http://django:80/)。 我现在需要 Traefik 位于一切前面,因为我需要集成 Authelia 而不是 HTTP 基本身份验证。我想首先在本地测试所有内容,这就是为什么这是本地主机。

这是我的

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

这是我的 traefik 配置:

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 web 应用程序,如果我通过 http://localhost:8080 访问它,它就可以工作。相反,我在浏览器中收到“太多重定向”错误,并且我可以在 apache 日志中看到它多次尝试访问服务器。 我做错了什么?

docker apache traefik
1个回答
0
投票

我猜测了你项目的很多细节。但假设它看起来像这样:

├── 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/ 将通过 Apache 访问 Django 应用程序;
  • http://localhost 将通过 Traefik 到达 Apache,从而到达 Django 应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.