จะเปลี่ยนเส้นทาง 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.