[docker] Traefik 2.0 및 Docker Compose 레이블을 사용하여 http를 https로 리디렉션하는 방법은 무엇입니까?

Traefik V2 질문입니다. 나는 V1에 대한 해결책을 가지고 있었지만 V2는 완전히 다시 수확되었습니다.

위의 내용은 http://whoami.mysite.com 을 http s : //whoami.mysite.com 으로 리디렉션해야합니다 .

  • 는 HTTP 잘 노력하고 있습니다.
  • http가 https로 리디렉션되지 않고 오류 404가 발생합니다.

다른 파일이 없습니다. 추가 배포를 준비하기위한 테스트이므로이 Docker-compose.yml에 모두 들어 있습니다.

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myhttpchallenge.acme.email=me@mail.com"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"



답변

Gérald Croës의 튜토리얼에는 다음과 같은 작업 솔루션이 있습니다.

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:
  traefik:
    image: "traefik:v2.0.0"
    # ...
    labels:
      # ...
      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # global redirect to https
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.redirs.entrypoints=web"
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"


답변

Traefik 서비스 자체를 구성 할 필요는 없습니다. Traefik에서는 : 443 (웹 보안) 및 : 80 (웹)에 대한 진입 점 만 있으면됩니다.

Traefik은 entryPoint의 역할 만하고 리디렉션을 수행하지 않기 때문에 대상 서비스의 미들웨어가이를 수행합니다.

이제 대상 서비스를 다음과 같이 구성하십시오.

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000

따라서 기본적으로 흐름은 다음과 같습니다.

요청 : http://sub.domain.com:80- > traefik (서비스)-> mywebserver-web (라우터, http 규칙)-> mywebserver-redirect-web-secure (미들웨어, https로 리디렉션)- -> mywebserver-web-secure (라우터, https 규칙)-> mywebserver (서비스)


답변

알았어 .. 미들웨어는 Traefik 수준에서 선언 할 수 있지만 서비스 수준에서 선언해야한다고 가정했습니다.

이 라인 :

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

whoami 서비스 레이블에 있어야합니다.

설명 된 문제점과 관련이없는 다른 요점은 http 챌린지를 포트 80에서 수행해야한다는 것입니다.

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

“웹 보안”에서 “보안”을 제거하십시오.


답변

Traefik v2.2를 통해 모든 것을 HTTPS로 리디렉션하는 방법을 찾고 있었을 때이 답변을 찾고 있었고 가장 좋은 옵션은이 ENV 변수를 Traefik에 추가하는 것이 었으며 모든 트래픽을 HTTPS로 자동 리디렉션합니다.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

이를 통해 미들웨어에 아무것도 추가 할 필요가 없습니다.


답변