Traefik 2.0およびDocker Composeラベルを使用してhttpをhttpsにリダイレクトする方法


14

これはTraefik V2の質問です。V1で解決策がありましたが、V2は完全な手直しです。

上記は、http ://whoami.mysite.com をhttp s://whoami.mysite.com にリダイレクトすることを想定しています

  • HTTP sがうまく働いています。
  • 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éraldCroë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
既存のacme.jsonがあると、ミドルウェアがHTTPSにリダイレクトするのをブロックできることに注意してください。Traefikの起動時にすでに存在する場合は削除してください。
AymDev

7

Traefikサービス自体を構成する必要はありません。Traefikでは、:443(web-secure)と:80(web)へのエントリポイントのみが必要です。

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(service)-> mywebserver-web(router、http rule)-> mywebserver-redirect-web-secure(middleware、redirect to https)- -> mywebserver-web-secure(ルーター、httpsルール)-> mywebserver(サービス)


それが要件かどうかはわかりません。あなたがそれを説明したように、リクエストはtraefikポート80に行き、スキームはhttpsに変更されてからバックエンドサービスに転送されるようです。ただし、バックエンドサービスはhttpsの終了を行わないため、失敗します。ホストを維持したまま、リクエストがポート443のtraefikに戻るように、実際のhttpリダイレクトを作成するというアイデアになります。Traefik v1では、静的構成を介して簡単に実行できました。
Andrei Dascalu、

これは機能します。これはドキュメントにあるはずです。あなただけのhttpバージョンのルーターを作成し、それにリダイレクトミドルウェアを置く必要があります。
milosa

2

OK、見つかりました...ミドルウェアはTraefikレベルで宣言できると思いましたが、これらはサービスレベルで宣言する必要があります。

この行:

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

whoamiサービスのラベルに含まれている必要があります。

上記の問題とは関係のないもう1つのポイントは、httpチャレンジがポート80で実行される必要があることです。

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

「web-secure」の「secure」を削除してください。


変わっている。Traefikサービスでリダイレクションミドルウェアを宣言し、アプリサービスから参照すると、動作します。
Izydorr

前のコードでは動作するようですが、httpは実際にはhttpsにリダイレクトしません。
Thib '17年

アプリからミドルウェアをどのように参照しますか?
Thib '17年

traefikサービスでは、私は、ミドルウェアを定義するラベルを持っています traefik.http.middlewares.https-only.redirectscheme.scheme=https し、アプリサービスで私がラベルを持っている:traefik.http.routers.myapp.rule=Host($ {} APP_HOST )traefik.http.routers.myapp.entrypoints=webtraefik.http.routers.myapp.middlewares=https-only
Izydorr

1
私はラベルにすべてを持っています。私が理解しているように、ミドルウェアを使用するには、2つのラベルが必要です。 = httpsのみ)。宣言は、たとえば、私と同じように、appサービスまたは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.