在 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。