mba*_*ldi 9 docker docker-compose docker-swarm traefik
我的问题是我可以路由 HTTPS 流量,但我无法将 HTTP 流量全局重定向到 HTTPS。就我而言,我只需要 HTTPS 流量,因此我想重定向所有传入流量。
目前,当我尝试通过 HTTP 提供我的 URL 时收到 404 错误。我已经在 Treafik 中启用了调试日志,但我在日志中看不到任何问题或异常内容。
此外,我在 Stackoverflow 上看到了一个非常相似的主题,但我们发现,他的错误与我的不同:如何使用 Traefik 2.0 和 Docker Compose 标签将 http 重定向到 https?
以下设置基于此处的博客条目: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
Run Code Online (Sandbox Code Playgroud)
并使用以下 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"
Run Code Online (Sandbox Code Playgroud)
我的服务配置了以下标签:
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
Run Code Online (Sandbox Code Playgroud)
任何想法为什么这不起作用?
Lar*_*ars 10
您不需要配置 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
Run Code Online (Sandbox Code Playgroud)
所以基本上流程是这样的:
请求:http ://sub.domain.com : 80 --> traefik(服务)--> mywebserver-web(路由器,http 规则)--> mywebserver-redirect-websecure(中间件,重定向到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`)"
Run Code Online (Sandbox Code Playgroud)
我还添加了certificates.toml内部 conf 目录。如果您在本地主机上工作,那么您可以使用 mkcert openssl 等添加它。对于生产,您需要从证书提供商处获取它。您需要将证书添加到 certs 文件夹中。
[[tls.certificates]] #first certificate
certFile = "/certs/_wildcard.traefik.localhost.pem"
keyFile = "/certs/_wildcard.traefik.localhost-key.pem"
Run Code Online (Sandbox Code Playgroud)
当然,您可以使用 Let 加密。有很多关于该主题的博客。
希望这可以节省您的时间。:)
| 归档时间: |
|
| 查看次数: |
10481 次 |
| 最近记录: |