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


14

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"

답변:


10

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"  

1
여기에 문서에서 고정 표시기 - compose.yml입니다 github.com/containous/blog-posts/blob/master/...은
TheOneRing

1
기존 acme.json이 있으면 미들웨어가 HTTPS로 경로 재 지정되는 것을 차단할 수 있습니다. Traefik 시동에 이미 존재하면 제거하십시오.
AymDev

7

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 포트 80으로 이동하고 스키마가 백엔드 서비스로 전달되기 전에 https로 변경되는 것으로 보입니다. 그러나 백엔드 서비스는 https 종료를 수행하지 않으므로 실패합니다. 아이디어는 호스트를 보존하는 포트 443에서 요청이 traefik으로 다시 돌아가도록 실제 http 리디렉션을 만드는 것입니다. 정적 구성을 통해 쉽게 수행 된 Traefik v1에서.
Andrei Dascalu

작동합니다. 이것은 문서에 있어야합니다. http 버전의 라우터를 만들고 리디렉션 미들웨어를 설치해야합니다.
milosa

2

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

이 라인 :

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

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

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

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

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


이상하다. Traefik 서비스에서 선언되고 앱 서비스에서 참조 된 리디렉션 미들웨어가 있으며 작동합니다.
Izydorr

이전 코드에서는 작동하는 것처럼 보이지만 http는 실제로 https로 리디렉션되지 않습니다.
Thib

앱에서 미들웨어를 어떻게 참조합니까?
Thib

traefik 서비스에서 나는 미들웨어를 정의하는 레이블이 : traefik.http.middlewares.https-only.redirectscheme.scheme=https 및 응용 프로그램 서비스에서 나는 라벨이 : traefik.http.routers.myapp.rule=Host($ {APP_HOST} ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr

1
라벨에 모든 것이 있습니다. 내가 이해하는 것처럼 미들웨어를 사용하려면 선언 / 구성 용 레이블 (traefik.http.middleware.https-only.redirectscheme.scheme = https)과 서비스에 적용하는 레이블 (traefik.http.routers.myapp.middleware)이라는 두 개의 레이블이 필요합니다. = https 전용). 선언은 앱 서비스 또는 treafik 서비스에있을 수 있습니다 (예 : 내가하는 것처럼). 앱 서비스에서 미들웨어를 선언하더라도 다른 장소에서 선언 된 다른 미들웨어와 함께 대시 보드에서 볼 수 있습니다. 어쩌면 나는 틀렸지 만 어떤 서비스에서도 사용할 수 있다고 생각합니다.
Izydorr

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.