我有一个 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-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>
您可以测试以下内容: