Traefik v2:404,同时将 HTTP 流量全局路由到 HTTPS
Traefik v2: 404 while routing HTTP traffic globally to HTTPS
我的问题是我可以路由 HTTPS 流量,但我无法将 HTTP 流量全局重定向到 HTTPS。就我而言,我只需要 HTTPS 流量,因此我想重定向所有传入流量。
目前,我在尝试通过 HTTP 提供 URL 时遇到 404 错误。
我已经在 Treafik 中启用了 DEBUG 日志,但我在日志中看不到任何问题或异常内容。
此外,我在 Whosebug 上看到了一个非常相似的主题,但我们发现,他的错误与我的不一样:
以下设置基于此处的博客条目: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
知道为什么这不起作用吗?
您不需要配置 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 (service) --> mywebserver-web (router, http rule) --> mywebserver-redirect-websecure (middleware, redirect to https) --> mywebserver -websecure(路由器,https 规则)--> mywebserver(服务)
这是为那些在 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
。如果您在本地主机上工作,那么您可以使用 mkcert openssl 等添加它。对于生产,您需要从证书提供商那里获取它。并且您需要在 certs 文件夹中添加证书。
[[tls.certificates]] #first certificate
certFile = "/certs/_wildcard.traefik.localhost.pem"
keyFile = "/certs/_wildcard.traefik.localhost-key.pem"
当然你也可以使用lets encrypt。有很多关于该主题的博客。
希望这可以节省您的时间。 :)
我的问题是我可以路由 HTTPS 流量,但我无法将 HTTP 流量全局重定向到 HTTPS。就我而言,我只需要 HTTPS 流量,因此我想重定向所有传入流量。
目前,我在尝试通过 HTTP 提供 URL 时遇到 404 错误。 我已经在 Treafik 中启用了 DEBUG 日志,但我在日志中看不到任何问题或异常内容。
此外,我在 Whosebug 上看到了一个非常相似的主题,但我们发现,他的错误与我的不一样:
以下设置基于此处的博客条目: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
知道为什么这不起作用吗?
您不需要配置 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 (service) --> mywebserver-web (router, http rule) --> mywebserver-redirect-websecure (middleware, redirect to https) --> mywebserver -websecure(路由器,https 规则)--> mywebserver(服务)
这是为那些在 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
。如果您在本地主机上工作,那么您可以使用 mkcert openssl 等添加它。对于生产,您需要从证书提供商那里获取它。并且您需要在 certs 文件夹中添加证书。
[[tls.certificates]] #first certificate
certFile = "/certs/_wildcard.traefik.localhost.pem"
keyFile = "/certs/_wildcard.traefik.localhost-key.pem"
当然你也可以使用lets encrypt。有很多关于该主题的博客。
希望这可以节省您的时间。 :)