Làm cách nào để chuyển hướng http sang https với nhãn Traefik 2.0 và Docker Compose?


14

Xin lưu ý rằng đó là một câu hỏi Traefik V2. Tôi đã có một giải pháp trên V1 nhưng V2 là tổng số lại.

Điều này ở trên được cho là chuyển hướng http://whoami.mysite.com đến http s : //whoami.mysite.com.

  • Các http s đang hoạt động độc đáo.
  • Http không chuyển hướng đến https và gây ra lỗi 404.

Không có tập tin khác. Tất cả đều có trong Docker-compose.yml này vì đây là một thử nghiệm để chuẩn bị triển khai hơn nữa.

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"

Câu trả lời:


10

Hiện tại có một giải pháp làm việc trong hướng dẫn từ Gérald Croës tại:

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
Đây là
docker

1
Lưu ý rằng việc có sẵn acme.json có thể chặn phần mềm trung gian chuyển hướng sang HTTPS. Hủy bỏ nó nếu nó đã tồn tại trên Traefik khởi động.
AymDev

7

Bạn không cần phải định cấu hình dịch vụ Traefik. Trên Traefik, bạn chỉ cần có các điểm truy cập đến: 443 (bảo mật web) và: 80 (web)

Vì Traefik chỉ hoạt động như entrypoint và sẽ không thực hiện chuyển hướng, phần mềm trung gian trên dịch vụ đích sẽ làm điều đó.

Bây giờ cấu hình dịch vụ mục tiêu của bạn như sau:

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

Về cơ bản, dòng chảy như thế này:

Yêu cầu: http://sub.domain.com:80 -> traefik (dịch vụ) -> mywebserver-web (bộ định tuyến, quy tắc http) -> mywebserver-redirect-web-safe (phần mềm trung gian, chuyển hướng đến https) - -> mywebserver-web-safe (bộ định tuyến, quy tắc https) -> mywebserver (dịch vụ)


Không chắc chắn đó là yêu cầu. Theo cách bạn mô tả, có vẻ như các yêu cầu đi vào cổng traefik 80 và lược đồ được thay đổi thành https trước khi được chuyển tiếp sang dịch vụ phụ trợ. Nhưng dịch vụ phụ trợ không thực hiện chấm dứt https, do đó sẽ thất bại. Ý tưởng sẽ là thực hiện chuyển hướng http thực tế để yêu cầu quay trở lại traefik trên cổng 443 bảo vệ máy chủ. Trong Traefik v1, điều đó được thực hiện dễ dàng thông qua cấu hình tĩnh.
Andrei Dascalu

Những công việc này. Điều này nên có trong tài liệu. Bạn chỉ cần tạo một bộ định tuyến cho phiên bản http và đặt phần mềm trung gian chuyển hướng vào đó.
milosa

2

Ok, tìm thấy ... Tôi giả định rằng phần mềm trung gian có thể được khai báo ở cấp độ Traefik nhưng chúng phải được khai báo ở cấp độ dịch vụ.

Đường thẳng này :

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

Phải có trong nhãn của dịch vụ whoami.

Một điểm khác, không liên quan đến vấn đề được mô tả, đó là thử thách http phải được thực hiện trên cổng 80.

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

Xóa "an toàn" trong "bảo mật web".


Nó thật kì lạ. Tôi có phần mềm trung gian chuyển hướng được khai báo trên dịch vụ Traefik và được gọi từ dịch vụ ứng dụng và nó hoạt động.
Izydorr

Với mã trước đó có vẻ như hoạt động nhưng http thực sự không chuyển hướng đến https.
Thib

Làm thế nào để bạn tham khảo Middleware từ ứng dụng?
Thib

Phục vụ traefik Tôi có một nhãn định middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https và phục vụ ứng dụng Tôi có một nhãn: traefik.http.routers.myapp.rule=Host($ {} APP_HOST ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr

1
Tôi có mọi thứ trong nhãn. Theo tôi hiểu, sử dụng phần mềm trung gian yêu cầu hai nhãn: một nhãn để khai báo / cấu hình (traefik.http.middlewares.https-only.redirectscheme.scheme = https) và sau đó áp dụng nó cho dịch vụ (traefik.http.routers.myapp.middlewares = Chỉ https). Tuyên bố có thể được đặt trong dịch vụ ứng dụng hoặc dịch vụ treafik chẳng hạn - giống như tôi làm điều đó. Lưu ý rằng ngay cả khi bạn khai báo một midwawe trong dịch vụ ứng dụng, bạn sẽ thấy nó trong bảng điều khiển cùng với các phần mềm trung gian khác được khai báo ở những nơi khác. Có thể tôi sai nhưng tôi nghĩ bạn có thể sử dụng bất kỳ trong số họ trong bất kỳ dịch vụ nào.
Izydorr

1

Tôi đã tìm kiếm câu trả lời này khi tôi đang tìm cách chuyển hướng mọi thứ sang HTTPS thông qua Traefik v2.2 và tùy chọn tốt nhất cho tôi là thêm các biến ENV này vào Traefik và nó tự động chuyển hướng tất cả lưu lượng truy cập vào HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Với điều này, tôi không cần thêm bất cứ thứ gì vào phần mềm trung gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.