Traefik v2:404,同时将 HTTP 流量全局路由到 HTTPS

Posted

技术标签:

【中文标题】Traefik v2:404,同时将 HTTP 流量全局路由到 HTTPS【英文标题】:Traefik v2: 404 while routing HTTP traffic globally to HTTPS 【发布时间】:2020-02-28 04:37:14 【问题描述】:

我有一个问题,我可以路由 HTTPS 流量,但我无法将 HTTP 流量全局重定向到 HTTPS。就我而言,我只需要 HTTPS 流量,因此我想重定向所有传入流量。

目前,当我尝试通过 HTTP 提供我的 URL 时出现 404 错误。 我已经在 Treafik 中启用了 DEBUG 日志,但我在日志中看不到任何问题或不正常的东西。

此外,我在 *** 上看到了一个非常相似的主题,但我们发现他的错误与我的不同:How to redirect http to https with Traefik 2.0 and Docker Compose labels?

以下设置基于此处的博客条目:https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

我的设置

我在我的 swarm 中这样配置 Traefik:

global:
  checkNewVersion: false
  sendAnonymousUsage: false
api:
  dashboard: true
entryPoints:
  web:
    address: :80
  websecure:
    address: :443
providers:
  providersThrottleDuration: 2s
docker:
  watch: true
  endpoint: unix:///var/run/docker.sock
  swarmMode: true
  swarmModeRefreshSeconds: 15s
  exposedByDefault: false
  network: webgateway
log:
  level: DEBUG
accessLog: 
certificatesResolvers:
  default:
    acme:
    email: email
    storage: /etc/traefik/acme/acme.json
    httpChallenge:
      entryPoint: web

并使用以下 docker-compose 文件启动 Traefik

version: '3'

services:
proxy:
    image: traefik:latest
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /data/docker_data/traefik/traefik-2.yml:/etc/traefik/traefik.yml
    - /data/docker_data/traefik/acme-2.json:/etc/traefik/acme/acme.json
    labels:
    # redirect
    - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    - "traefik.http.routers.redirs.rule=hostregexp(`host:.+`)"
    - "traefik.http.routers.redirs.entrypoints=web"
    - "traefik.http.routers.redirs.middlewares=redirect-to-https"

我的服务配置有以下标签:

traefik.http.routers.myapp.rule=Host(`myapp.ch`)
traefik.http.routers.myapp.service=myapp
traefik.http.routers.myapp.entrypoints=websecure
# I don't think that the following one is required here...
# traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
traefik.http.routers.myapp.tls.certresolver=default
traefik.http.services.myapp.loadbalancer.server.port=3000
traefik.http.routers.myapp.tls=true
traefik.enable=true

任何想法为什么这不起作用?

【问题讨论】:

How to redirect http to https with Traefik 2.0 and Docker Compose labels?的可能重复 Lars 的回答是,是的。但是用他的配置我无法全局解决,但是我能够解决。 【参考方案1】:

这是为那些在 Traefik 2 上尝试全局 HTTP 到 HTTPS 重定向的人准备的。你们中的一些人可能会在 http 端点上得到 404。在不同的论坛上花费数小时后。这对我有用。这也适用于想要使用预签名 ssl 证书的人。

由于我们大多数人都使用 traefik 博客中提供的配置,并且许多不包含我们出于安全目的声明的 traefik 容器的命令部分

"--providers.docker.exposedbydefault=false"

如果我们不提供,这会阻止全局 https 重定向器工作

"traefik.enable=true"

这是完整的文件

version: "3.8"
services:
  traefik:
    image: "traefik:v2.2.1"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.watch=true"
      - "--providers.file.directory=/conf/"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
    ports:
      - "80:80"
      - "443:443"
    networks:
      - somenetwork
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - ./certs:/certs
      - ./conf:/conf
    labels:
      # this is needed as we did the --providers.docker.exposedbydefault=false
      - "traefik.enable=true"
      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # global redirect to https
      - "traefik.http.routers.http-catchall.rule=hostregexp(`host:.+`)"
      - "traefik.http.routers.http-catchall.entrypoints=web"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    networks:
      - somenetwork
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami-secure.entrypoints=websecure"
      - "traefik.http.routers.whoami-secure.tls=true"
      - "traefik.http.routers.whoami-secure.rule=Host(`test.traefik.localhost`)"

我还在 conf 目录中添加了certificates.toml。如果您在 localhost 上工作,那么您可以使用 mkcert openssl 等添加它。对于生产,您需要从证书提供者那里获取它。并且您需要在 certs 文件夹中添加证书。

[[tls.certificates]] #first certificate
   certFile = "/certs/_wildcard.traefik.localhost.pem"
   keyFile = "/certs/_wildcard.traefik.localhost-key.pem"

当然你也可以使用 let 加密。有很多关于该主题的博客。

希望这可以节省您的时间。 :)

【讨论】:

【参考方案2】:

您不需要配置 Traefik 服务本身。在 Traefik 上,您只需要拥有 :443 (websecure) 和 :80 (web) 的入口点

因为 Traefik 只作为入口点,不会做重定向,所以目标服务上的中间件会做。

现在配置你的目标服务如下:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-websecure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-websecure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-websecure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-websecure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-websecure.tls=true
      - traefik.http.routers.mywebserver-websecure.entrypoints=websecure
      # if you have multiple ports exposed on the service, specify port in the websecure service
      - traefik.http.services.mywebserver-websecure.loadbalancer.server.port=9000

所以基本上流程是这样的:

请求:http://sub.domain.com:80 --> traefik(服务)--> mywebserver-web(路由器,http规则)--> mywebserver-redirect-websecure(中间件,重定向到https)--> mywebserver-websecure(路由器, https 规则)--> mywebserver(服务)

【讨论】:

感谢您的回答拉斯。我试过了yey我成功了。太感谢了。但是:当我再次阅读您的答案时。在 Traefik v2 中是否无法创建全局重定向?无论如何,我对您的回答很感兴趣,但我会将这个问题设置为已解决。 我还没有想出在全球范围内这样做。我认为目前不可能...... :) 目前不可能。他们意识到这一点/想要改进这一点。 community.containo.us/t/a-global-http-https-redirection/864/7 另外,解决方法:community.containo.us/t/…

以上是关于Traefik v2:404,同时将 HTTP 流量全局路由到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

traefik - 同一主机的多个端口绑定 V2

Kubernetes 集群部署 Ingress Traefik v2.4

Kubernetes 集群部署 Ingress Traefik v2.4

Kubernetes 集群部署 Ingress Traefik v2.4

如何使用 Traefik 2.0 和 Docker Compose 标签将 http 重定向到 https?

Springfox swagger 2 不适用于 Spring Boot 1.5:在 /v2/api-docs 中找不到 HTTP 404