จะเปลี่ยนเส้นทาง http เป็น https ด้วย Traefik 2.0 และ Docker Compose อย่างไร


14

โปรดทราบว่ามันเป็นคำถาม Traefik V2 ฉันมีทางออกใน V1 แต่ V2 เป็น rewamp ทั้งหมด

สิ่งนี้ควรเปลี่ยนเส้นทาง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
นี่คือนักเทียบท่า-compose.yml จากบทความgithub.com/containous/blog-posts/blob/master/…
— TheOneRing

1
โปรดทราบว่าการมีacme.jsonที่มีอยู่สามารถบล็อกมิดเดิลแวร์จากการเปลี่ยนเส้นทางไปยัง HTTPS ลบออกหากมีอยู่แล้วใน Traefik เริ่มต้นขึ้น
— AymDev

7

คุณไม่จำเป็นต้องกำหนดค่าบริการ Traefik เอง ใน Traefik คุณจะต้องมีจุดเข้าใช้งานที่: 443 (ความปลอดภัยบนเว็บ) และ: 80 (เว็บ)

เนื่องจาก Traefik ทำหน้าที่เป็นเพียงจุดเริ่มต้นเท่านั้นและจะไม่ทำการเปลี่ยนเส้นทางมิดเดิลแวร์ของบริการเป้าหมายจะทำเช่นนั้น

ตอนนี้กำหนดค่าบริการเป้าหมายของคุณดังต่อไปนี้:

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 ดังนั้นมันจะล้มเหลว แนวคิดจะทำการเปลี่ยนเส้นทาง http จริงเพื่อให้คำขอกลับไปที่ traefik บนพอร์ต 443 รักษาโฮสต์ ใน 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

คุณอ้างถึง Middleware จากแอพอย่างไร
— 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.middlewares.https-only.redirectscheme.scheme = https) แล้วนำไปใช้กับบริการ (traefik.http.routers.myapp.middlewares = https เท่านั้น) การประกาศอาจอยู่ในบริการแอพหรือในบริการ treafik เช่นเดียวกับที่ฉันทำ โปรดสังเกตว่าแม้ว่าคุณจะประกาศ midwawe ในบริการแอพคุณจะเห็นมันในแดชบอร์ดพร้อมกับมิดเดิลแวร์อื่นที่ประกาศในที่อื่น บางทีฉันผิด แต่ฉันคิดว่าคุณสามารถใช้พวกเขาใด ๆ ในบริการใด ๆ
— Izydorr

1

ฉันค้นหาคำตอบนี้เมื่อฉันค้นหาวิธีเปลี่ยนเส้นทางทุกอย่างไปยัง HTTPS ผ่าน Traefik v2.2 และตัวเลือกที่ดีที่สุดสำหรับฉันคือการเพิ่มตัวแปร 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.