在 Docker 上使用 Traefik 允许 http 和 https
Allow both http and https with Traefik on Docker
我在我的 VPS 中使用 Traefik
将流量路由到我的网站,经过几个小时的折腾,我终于设法让它与 https
一起使用 Le's加密。
现在,我需要做的一件事就是能够通过普通 http
访问我的网站,因为这是旧浏览器的业余爱好项目,我添加 tls
的唯一原因是因为 Firefox 不喜欢没有它的我的网站。
问题是,根据我当前的配置,我可以通过 https
正常访问我的网站,但是当我尝试使用纯 http
访问我的网站时,出现 404
错误。
这是我在 docker-compose
上的配置:
version: "3"
services:
traefik:
image: "traefik:v2.5"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.teeresolver.acme.tlschallenge=true"
- "--certificatesresolvers.teeresolver.acme.email=me@gmail.com"
- "--certificatesresolvers.teeresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443"
- "80:80"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- mywebsite
# [...]
mywebsite:
image: my-web-site/site
build:
context: ~/mywebsite-runner/_work/my-web-site-php/my-web-site-php
dockerfile: Dockerfile
volumes:
- ./tee-downloads:/var/www/build/downloads
- ./tee-contents:/var/www/build/contents
ports:
- "0.0.0.0:8001:80"
labels:
- "traefik.enable=true"
- "traefik.http.routers.themywebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- "traefik.http.routers.themywebsite.entrypoints=websecure,web"
- "traefik.http.routers.themywebsite.tls.certresolver=teeresolver"
networks:
- mywebsite
networks:
mywebsite:
我已经搜索了几个小时的解决方案,但我在 google 上唯一能找到的是将 http
重定向到 https
的配置,我做不到。
有人知道怎么做吗?
在此先感谢您的帮助。
在 traefik 中,每个 router
定义了一组根据规则和入口点应用的策略。
如果你想要2个策略,一个用于http,一个用于https,你需要定义2个traefik routers
:
mywebsite:
...
labels:
- "traefik.enable=true"
- "traefik.http.routers.themywebsite.entrypoints=websecure"
- "traefik.http.routers.themywebsite.tls.certresolver=teeresolver"
- "traefik.http.routers.themywebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- "traefik.http.routers.httpwebsite.entrypoints=web"
- "traefik.http.routers.httpwebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- 一个叫
themywebsite
- 另一个叫
httpwebsite
因此,您没有为 httpwebsite
路由器使用 certresolver。
我在我的 VPS 中使用 Traefik
将流量路由到我的网站,经过几个小时的折腾,我终于设法让它与 https
一起使用 Le's加密。
现在,我需要做的一件事就是能够通过普通 http
访问我的网站,因为这是旧浏览器的业余爱好项目,我添加 tls
的唯一原因是因为 Firefox 不喜欢没有它的我的网站。
问题是,根据我当前的配置,我可以通过 https
正常访问我的网站,但是当我尝试使用纯 http
访问我的网站时,出现 404
错误。
这是我在 docker-compose
上的配置:
version: "3"
services:
traefik:
image: "traefik:v2.5"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.teeresolver.acme.tlschallenge=true"
- "--certificatesresolvers.teeresolver.acme.email=me@gmail.com"
- "--certificatesresolvers.teeresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443"
- "80:80"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- mywebsite
# [...]
mywebsite:
image: my-web-site/site
build:
context: ~/mywebsite-runner/_work/my-web-site-php/my-web-site-php
dockerfile: Dockerfile
volumes:
- ./tee-downloads:/var/www/build/downloads
- ./tee-contents:/var/www/build/contents
ports:
- "0.0.0.0:8001:80"
labels:
- "traefik.enable=true"
- "traefik.http.routers.themywebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- "traefik.http.routers.themywebsite.entrypoints=websecure,web"
- "traefik.http.routers.themywebsite.tls.certresolver=teeresolver"
networks:
- mywebsite
networks:
mywebsite:
我已经搜索了几个小时的解决方案,但我在 google 上唯一能找到的是将 http
重定向到 https
的配置,我做不到。
有人知道怎么做吗?
在此先感谢您的帮助。
在 traefik 中,每个 router
定义了一组根据规则和入口点应用的策略。
如果你想要2个策略,一个用于http,一个用于https,你需要定义2个traefik routers
:
mywebsite:
...
labels:
- "traefik.enable=true"
- "traefik.http.routers.themywebsite.entrypoints=websecure"
- "traefik.http.routers.themywebsite.tls.certresolver=teeresolver"
- "traefik.http.routers.themywebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- "traefik.http.routers.httpwebsite.entrypoints=web"
- "traefik.http.routers.httpwebsite.rule=Host(`mywebsite.com`, `www.mywebsite.com`)"
- 一个叫
themywebsite
- 另一个叫
httpwebsite
因此,您没有为 httpwebsite
路由器使用 certresolver。