Django无法捕获Traefik的请求

问题描述

我最近配置了traefik来管理我的子域及其证书(LetsEncrypt)。因此,目前有三项服务:traefik本身,nginx(用于处理静态文件,尚未完全配置)和django。所有这些服务都可以正常工作,并且没有错误。但是我对traefik和django应用之间的通信感到不走运。在下文中,我向您展示我的项目文件夹结构和配置文件,如果有人可以提供帮助,那就太好了。

enter image description here

.
├── proxy
│   ├── acme.json
│   ├── docker-compose.yml
│   └── traefik.toml
└── services
    ├── django
    │   ├── docker-compose.yml
    │   ├── Dockerfile
    │   ├── example
    │   │   ├── asgi.py
    │   │   ├── __init__.py
    │   │   ├── settings
    │   │   │   ├── base.py
    │   │   │   ├── dev.py
    │   │   │   ├── __init__.py
    │   │   │   └── prod.py
    │   │   ├── urls.py
    │   │   └── wsgi.py
    │   ├── manage.py
    │   ├── media
    │   ├── Pipfile
    │   ├── Pipfile.lock
    │   ├── scripts
    │   │   ├── entrypoint.sh
    │   │   └── entrypoint.sh_backup
    │   └── staticfiles
    └── nginx
        ├── default.conf
        └── docker-compose.yml

# cat proxy/traefik.toml

[accessLog]

[log]
  level = "INFO"

[api]
  dashboard = true
  insecure = false

[providers]
  [providers.docker]
    exposedByDefault = false
    watch = true
    network = "web"


[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.web-secure]
    address = ":443"


[certificatesResolvers]
  [certificatesResolvers.letsEncrypt.acme]
    email = "example@gmail.com"
    storage = "acme.json"
    [certificatesResolvers.letsEncrypt.acme.httpChallenge]
      entryPoint = "web"
    [certificatesResolvers.letsEncrypt.acme.tlsChallenge]

# cat proxy/docker-compose.yml

version: '3.7'

services:
    traefik:
        image: traefik:latest
        container_name: traefik
        restart: always
        labels:
           - "traefik.enable=true"
           - "traefik.http.routers.${SERVICE}.rule=Host(`${DOMAIN_NAME}`)"
           - "traefik.http.routers.${SERVICE}.service=api@internal"
           - "traefik.http.routers.${SERVICE}.tls.certresolver=letsEncrypt"
           - "traefik.http.routers.${SERVICE}.entrypoints=web-secure"
           - "traefik.http.routers.${SERVICE}.middlewares=${SERVICE}_auth"
           - "traefik.http.middlewares.${SERVICE}_auth.basicauth.users=example:example"
           - "traefik.http.middlewares.${SERVICE}_https.redirectscheme.scheme=https"
           - "traefik.http.routers.${SERVICE}_redirect.rule=Host(`${DOMAIN_NAME}`)"
           - "traefik.http.routers.${SERVICE}_redirect.entrypoints=web"
           - "traefik.http.routers.${SERVICE}_redirect.middlewares=${SERVICE}_https"
           - "com.centurylinklabs.watchtower.enable=true"
        ports:
            - 80:80
            - 443:443
        volumes:
           - /var/run/docker.sock:/var/run/docker.sock
           - ./traefik.toml:/traefik.toml
           - ./acme.json:/acme.json
        networks:
            - web

networks:
    web:
       external: true

# cat services/django/docker-compose.yml

version: '3.7'

services:
    django:
        container_name: dj
        build:
            context: ./
        restart: unless-stopped
        labels:
           - "traefik.enable=true"
           - "traefik.http.routers.${SERVICE}.rule=Host(`${DOMAIN_NAME}`)"
           - "traefik.http.routers.${SERVICE}.tls.certresolver=letsEncrypt"
           - "traefik.http.routers.${SERVICE}.entrypoints=web-secure"
           - "traefik.http.services.${SERVICE}.loadbalancer.server.port=5000"
        volumes:
           - staticfiles:/app/staticfiles
           - mediafiles:/app/media
        env_file: .env
        command: gunicorn example.wsgi:application --bind 0.0.0.0:5000 -k uvicorn.workers.UvicornWorker
        expose:
            - 5000
        networks:
            - web

volumes:
    staticfiles:
    mediafiles:

networks:
    web:
        external: true

正如我之前所说,所有这些服务都可以独立运行而不会出错。我的问题实际上是我做错了哪一部分,为什么Django无法收到Traefik的请求?

这里也是Traefik和Django在重新加载页面时的日志:

# TRAEFIK LOGS
31.24.11.55 - - [29/Aug/2020:03:11:16 +0000] "GET / HTTP/1.1" 404 19 "-" "-" 375 "-" "-" 0ms
31.24.11.55 - - [29/Aug/2020:03:11:16 +0000] "GET / HTTP/1.1" 404 19 "-" "-" 376 "-" "-" 0ms
31.24.11.55 - - [29/Aug/2020:03:11:17 +0000] "GET / HTTP/1.1" 404 19 "-" "-" 377 "-" "-" 0ms
31.24.11.55 - - [29/Aug/2020:03:11:17 +0000] "GET / HTTP/1.1" 404 19 "-" "-" 378 "-" "-" 0ms


# DJANGO LOGS
165 static files copied to '/app/staticfiles'.
[2020-08-29 02:36:29 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2020-08-29 02:36:29 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2020-08-29 02:36:29 +0000] [1] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-08-29 02:36:29 +0000] [11] [INFO] Booting worker with pid: 11
Debugging status is:  False
[2020-08-29 02:36:30 +0000] [11] [INFO] Started server process [11]
[2020-08-29 02:36:30 +0000] [11] [INFO] Waiting for application startup.
[2020-08-29 02:36:30 +0000] [11] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2020-08-29 02:36:30 +0000] [11] [INFO] Application startup complete.

解决方法

天哪,我已经浪费了很多时间。问题仅仅是ALLOWED_HOSTS(Facepalm)。

我打开DEBUG = True,直到那时我才看到错误是由ALLOWED_HOSTS引起的。只需将主机添加到此列表即可解决我的问题!

SO伙计们总是在初始部署时打开DEGUB = True来发现任何问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...